Помещение оператора Select в транзакцию

10

В чем разница между этими 2 запросами:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

И без транзакции:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Каков эффект от SELECTвнутренней транзакции?

Если DELETE FROM orders WHERE id=1был вызван из другого сеанса сразу после SELECTв обоих случаях, когда он будет обработан?

Songo
источник

Ответы:

5

Сам по себе запрос SELECT внутри транзакции не защищен должным образом от UPDATE и DELETE.

Для чего нужно использовать следующее:

Если вы выполните Delete From orders Where id=1команду, это произойдет, как только строки в ordersтаблице освободят свои блокировки в конце транзакции. Вы можете поэкспериментировать (на Dev / Staging Server, пожалуйста) с использованием READ UNCOMMITTEDуровня изоляции транзакции, чтобы логически удалить удаление, но только при фиксации оно станет видимым и записанным навсегда.

Во второй транзакции в основном все ставки отключены. Если вы бежите

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

бег Delete From orders Where id=1совершит немедленно. В зависимости от порядка выполнения этих операторов MySQL, вы увидите (или не увидите) строки удаления.

ПРЕДОСТЕРЕЖЕНИЕ

MySQL 5.6 теперь имеет следующее :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Модификаторы READ WRITE и READ ONLY устанавливают режим доступа к транзакции. Они разрешают или запрещают изменения таблиц, используемых в транзакции. Ограничение READ ONLY не позволяет транзакции изменять или блокировать как транзакционные, так и нетранзакционные таблицы, которые видны другим транзакциям; транзакция все еще может изменять или блокировать временные таблицы. Эти модификаторы доступны с MySQL 5.6.5.

RolandoMySQLDBA
источник