Intereting Posts
Тема_разработка drupal Android: как сделать мой извлеченный (из mysql) анализируемые данные JSON, добавленные в ListView, обновить его каждую минуту Как изменить размер изображения в php, чтобы поместить его в ящик нестандартного размера, сохраняя его соотношение сторон? Laravel, мне нужно несколько таблиц базы данных для голосования на разных моделях Альтернатива множеству логических значений в MySQL? Использование дискриминатора в сущности, которая расширяет другую MySQL GROUP_CONCAT: форматирование вывода WordPress: получить информацию об авторе из сообщения id Как получить список друзей пользователя через facebook? Возврат двух отдельных результатов запроса в рамках функции модели почему это предупреждение появилось :::::: mysql_connect (): php_network_getaddresses: getaddrinfo не удалось: такой хост не известен cc в php mail не работает Как программно «нажимать» кнопку «Как» через приложение Facebook? Как я могу проверить знак плюса с помощью регулярных выражений? Как создать новую модель с Sylius через SyliusResourceBundle

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.