MySQL事务是否会锁定正在更新和/或选取的InnoDB行?

3

使用InnoDB,当调用BEGIN时,MySQL事务是否会锁定新创建的行,并在调用commit时解锁它们? 例如:

$query = "INSERT INTO employee (ssn,name,phone) 
values ('123-45-6789','Matt','1-800-555-1212')";
mysql_query("BEGIN");
$result = mysql_query($query);
mysql_query("COMMIT);

INSERT语句会锁定该行直到COMMIT被调用,以防止其他并发连接对其进行修改。

如果没有这样做,您只能在事务中锁定一个行,通过调用来阻止读取和任何修改。

1个回答

3

在事务提交之前,新创建的记录对于其他连接是不可见的。其他连接无法修改它,因此无需锁定它。


所以无论是插入、更新还是选择语句,只要在事务中调用,它都遵循ACID序列化,因此被锁定(其他事务无法读取或写入?) - tommo
是的,默认情况下是这样。除非你将 --transaction-isolation 选项配置为其他内容。有关更多信息,请阅读此文档:http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html。 - vidang
当你说“新创建的记录是不可见的,所以没有必要锁定它”时,如果记录不是新的,而是调用了“更新”,那么需要通过在事务中使用“SELECT FOR UPDATE”来锁定要更新的表,对其他连接不可见。请参阅:http://www.databasejournal.com/features/mysql/article.php/10897_3382171_2/Transactions-in-MySQL.htm - tommo
嗨,tommo,我之前关于在事务中进行更新时会发生什么的回答是不正确的。让我来纠正一下。当您在事务中对记录进行更新时,该记录将自动锁定,直到事务提交为止。SELECT...FOR UPDATE会在所选记录上放置一个锁定,如果任何所选记录仍然被锁定,则选择将等待锁定释放后才返回结果。 - vidang
那个链接对我也很有用。谢谢! - vidang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接