将 Select 语句放入事务中

Son*_*ngo 11 mysql innodb concurrency transaction

这两个查询有什么区别:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

并且没有交易:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  
Run Code Online (Sandbox Code Playgroud)

SELECT内部交易有什么影响?

如果在这两种情况下都在DELETE FROM orders WHERE id=1另一个会话之后立即调用SELECT,它将在什么时候被处理?

Rol*_*DBA 5

事务内的 SELECT 查询本身没有正确屏蔽 UPDATE 和 DELETE。

您需要使用以下内容:

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

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

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;
Run Code Online (Sandbox Code Playgroud)

运行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 开始可用。