Intereting Posts
APC -> APCu / OPCache, производительность низкая Что делает FILTER_SANITIZE_STRING? Сообщение электронной почты CodeIgniter SMTP – символы заменены одинаковыми знаками Как нажать следующую дату / время на массив, который соответствует текущей дате / времени в массиве? PHP: какова продолжительность жизни сеанса по умолчанию Почему WordPress считается плохо запрограммированным? MySQL получает разговор между двумя пользователями Как создать XML-файл со специальными символами Как помнить Флажок / Выбор радиокнопки в форме мулитной страницы Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов Можно ли извлечь встроенный CSS из HTML? Неопределенный индекс: REMOTE_ADDR, в то время как Laravel migrate Папка PHP Sessions: обновите продукт, если он уже является идентификатором сеанса Удалить объект списка массива, если его дата (свойство) составляет 15 дней в отношении любой другой даты объекта Soap answert string – преобразование в атрибут

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 

Solutions Collecting From Web of "Mysql транзакция: фиксация и откат"

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.