Транзакция 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 (i.e. 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
2 ответов:
1) все изменения, которые вы делаете, видны в рамках одной транзакции. Если вы это сделаете
START TRANSACTION; INSERT INTO MyTable VALUES ('Hi there'); SELECT * FROM MyTable;Ваш вывод будет включать в себя "Привет". Но если вы запускаете второе подключение к базе данных, новая строка не будет отображаться до тех пор, пока вы не зафиксируете транзакцию из первого подключения. Попробуйте поиграть с этим, используя два подключения к базе данных с помощью командной строки.
Вы не видите эффекта на своем веб-сайте, потому что у вас не может быть одной и той же транзакции в пределах двух подключений к базе данных (a новое db-соединение будет сделано в начале вашего запроса).
2) все транзакции, которые не были зафиксированы, будут откатываться при закрытии соединения с базой данных. Так что если это ваши единственные два запроса, то разницы нет. Однако есть разница между
3) Да, все они одинаковы.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');
Изменения, внесенные в рамках одной транзакции, не видны другим транзакциям (за исключением транзакций с уровнем изоляции
READ UNCOMMITTED) до тех пор, пока транзакция не будет зафиксирована.Существует огромная разница между откатом транзакции и сохранением ее открытой навсегда (или до тех пор, пока двигатель не убьет ее из-за таймаута). Последнее означает, что сервер не может освободить ресурсы, выделенные для поддержки транзакции. Кроме того, поскольку вы делаете
UPDATE, mysql должен выдавать эксклюзивные блокировки на строки затронуты, и никакая другая транзакция не может обновить / удалить эти строки. Если у вас есть приложение, которое оставляет транзакции открытыми, вы, скорее всего, закончите либо все соединения заняты и ждут вечно, либо куча тупиков .Да, они все начинают новую транзакцию в mysql.
Comments