Я обновил свой механизм базы данных 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) Да, это все одинаково.
Изменения, сделанные вами в рамках одной транзакции, не видны другим транзакциям (кроме транзакций с READ UNCOMMITTED
изоляции READ UNCOMMITTED
) до момента совершения транзакции.
Существует огромная разница между откатом транзакции и сохранением ее навсегда (или пока двигатель не убьет ее из-за таймаута). Последнее означает, что сервер не может освобождать ресурсы, выделенные для поддержки транзакции. Кроме того, поскольку вы делаете UPDATE
, mysql должен выдавать исключительные блокировки на затронутых строках, и никакая другая транзакция не может обновлять / удалять эти строки. Если у вас есть приложение, которое оставляет транзакции открытыми, вы, скорее всего, окажетесь в любом соединении, занятом и ожидающем навсегда, или в кучке блокировок.
Да, они все начинают новую транзакцию в mysql.