将Select语句放入事务中


10

这两个查询之间有什么区别:

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在另一个会话中被调用,它将在何时进行处理?

Answers:


5

事务内部的SELECT查询本身并未适当地屏蔽UPDATE和DELETE。

您需要使用以下内容:

如果您发出问题Delete From orders Where id=1,则一旦orders表中的行在事务结束时释放了它们的锁,就会发生这种情况。您可以尝试使用READ UNCOMMITTED事务隔离级别(请在Dev / Staging Server上),使删除操作在逻辑上发生,但是只有在提交后,它才会变得可见并被永久记录。

在第二笔交易中,基本上所有赌注都没有了。如果你跑

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修改器设置事务访问模式。它们允许或禁止更改事务中使用的表。只读限制可防止事务修改或锁定其他事务可见的事务表和非事务表。事务仍然可以修改或锁定临时表。这些修饰符自MySQL 5.6.5起可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.