我有一项类似于以下(伪)的金融交易:
begin
select record for update
update record(same record as selected)
insert another record into another table
commit如果我在事务中调用SELECT ... FOR UPDATE,那么只有当事务提交时,才会释放特定行的锁吗?
发布于 2014-02-12 06:53:25
根据MySQL 5.0认证研究指南 418页第3段

以下命令可以破坏事务
ALTER TABLEBEGINCREATE INDEXDROP DATABASEDROP INDEXDROP TABLERENAME TABLETRUNCATE TABLELOCK TABLESUNLOCK TABLESSET AUTOCOMMIT = 1START TRANSACTION只要在事务中不执行任何这些命令,事务就应该是稳定的。实际上,SELECT FOR UPDATE是如此强大,以至于行锁入侵了索引和数据。它甚至可能引发可能的InnoDB死锁。我曾经在这篇文章里写过:选择“更新”使索引列出现错误
只要您保持事务简短和甜蜜,SELECT FOR UPDATE就不会是一个问题。如果要保护事务不受间歇性或意外死锁的影响,MySQL 5.6现在有以下内容:
START TRANSACTION READ WRITE;START TRANSACTION READ ONLY;您应该使用这样的选项启动事务。为什么?
根据那个MySQL文档的说法:
读、写和只读修饰符设置事务访问模式。它们允许或禁止对事务中使用的表进行更改。只读限制阻止事务修改或锁定对其他事务可见的事务性表和非事务性表;事务仍然可以修改或锁定临时表。这些修饰符可在MySQL 5.6.5中使用。
你最后的评论是
因此,我是否可以以另一种方式锁定事务中的行,以便进行更新?
您还可以运行选择。锁定共享模式。文件上说
尽管有可能,但要保持交易时间短。否则,您可能会增加死锁的可能性。
为了澄清任何误解,请从MySQL文档中注意这一点.:
在提交或回滚事务时,由锁在共享模式下设置的所有锁和用于更新查询的所有锁都会被释放。
因此,如果执行SELECT .在事务内锁定共享模式,这些行将保持锁定状态,直到事务提交或回滚。
发布于 2016-09-09 08:56:30
另外,如果异常处理程序不在循环,并且事务范围与in循环一起,即使mysql在异常情况下中断事务,最好声明异常处理程序(如果有相同范围的事务被声明)。
https://dba.stackexchange.com/questions/58709
复制相似问题