Транзакция 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
883   2  

2 ответов:

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

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

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

Вы не видите эффекта на своем веб-сайте, потому что у вас не может быть одной и той же транзакции в пределах двух подключений к базе данных (a новое 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) до тех пор, пока транзакция не будет зафиксирована.

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

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

Comments

    Ничего не найдено.