Mysql транзакция: фиксация и откат

Я обновил свой механизм базы данных PhpMyAdmin от MyISAM до INNODB, чтобы разрешить откат.

Это мой SQL-запрос:

START TRANSACTION; UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2'); 

И результат:

 start transaction;# MySQL returned an empty result set (ie zero rows). UPDATE jkm_content SET state=1 WHERE title IN ('title-1','title2');# 2 rows affected. 

1) Таким образом, заявление сообщает мне, что затронуты 2 строки, но это изменение не появляется нигде (ни в моей БД, ни на веб-сайте). Хотя start transaction позволила мне визуализировать изменения (во временной БД), а затем если я удовлетворен, я «совершаю» запрос. (Я понимаю, что мне нужно commit обновление БД, но если я commit изменение, оно будет постоянным).

2) Затем я не получаю rollback если я не вижу эффекта до его совершения. Какая разница между этими двумя запросами:

 START TRANSACTION; UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2'); 

А ТАКЖЕ

 START TRANSACTION; UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2'); ROLLBACK; 

3) если я правильно понял, эти функции одинаковы:

 START TRANSACTION BEGIN BEGIN WORK 

1) Все сделанные вами изменения видны внутри одной транзакции. Если вы это сделаете

 START TRANSACTION; INSERT INTO MyTable VALUES ('Hi there'); SELECT * FROM MyTable; 

ваш выход будет включать «Привет». Но если вы начнете второе соединение с базой данных, новая строка не будет отображаться до тех пор, пока вы не перенесите транзакцию из первого соединения. Попробуйте сыграть с этим, используя два соединения с базой данных, используя командную строку.

Вы не видите эффект на своем веб-сайте, потому что вы не можете иметь одну транзакцию в двух соединениях с базой данных (новое соединение db будет сделано в начале вашего запроса).

2) Все транзакции, которые не были выполнены, будут отменены, когда соединение с базой данных будет закрыто. Поэтому, если это ваши два вопроса, нет никакой разницы. Однако существует разница между

 START TRANSACTION; INSERT INTO MyTable VALUES ('This one would be discarded on rollback'); ROLLBACK; INSERT INTO MyTable VALUES ('This one will be permanent because not within transaction'); 

3) Да, это все одинаково.

  1. Изменения, сделанные вами в рамках одной транзакции, не видны другим транзакциям (кроме транзакций с READ UNCOMMITTED изоляции READ UNCOMMITTED ) до момента совершения транзакции.

  2. Существует огромная разница между откатом транзакции и сохранением ее навсегда (или пока двигатель не убьет ее из-за таймаута). Последнее означает, что сервер не может освобождать ресурсы, выделенные для поддержки транзакции. Кроме того, поскольку вы делаете UPDATE , mysql должен выдавать исключительные блокировки на затронутых строках, и никакая другая транзакция не может обновлять / удалять эти строки. Если у вас есть приложение, которое оставляет транзакции открытыми, вы, скорее всего, окажетесь в любом соединении, занятом и ожидающем навсегда, или в кучке блокировок.

  3. Да, они все начинают новую транзакцию в mysql.