“SELECT ... LOCK IN SHARE MODE”和“SELECT ... FOR UPDATE”必须在交易中吗?

时间:2014-12-11 02:43:57

标签: mysql select transactions sql-update

我正在阅读the documentation这些命令并感到困惑。命令的描述提到了交易:

  

SELECT ... LOCK IN SHARE MODE在任何行上设置共享模式锁定   正在阅读其他会话可以读取行,但不能修改它们   直到您的交易提交。如果这些行中的任何一行被更改了   另一个尚未提交的事务,您的查询会等到   交易结束,然后使用最新值。

     

对于搜索遇到的索引记录,SELECT ... FOR UPDATE块   其他会话来自SELECT ... LOCK IN SHARE MODE或来自   阅读某些交易隔离级别。一致的读取会   忽略在读取视图中存在的记录上设置的任何锁定。 (旧   记录的版本无法锁定;他们将被重建   将undo日志应用于记录的内存中副本。)

但是这些示例并未显示正在使用的事务。在没有事务的情况下运行select * from users for update;等测试命令不会导致任何错误(它可以正常工作)。这是否意味着事务不必与这些命令一起使用?如果是这样,将这些命令放在事务中是否有任何好处?

2 个答案:

答案 0 :(得分:2)

在InnoDB中,每个查询都在事务中有效运行。如果您没有显式启动事务(使用启动事务或通过将自动提交设置为关闭),则在查询运行后提交每个事务。这意味着如果您不在事务中,则在查询完成后将立即释放使用SELECT ... IN SHARE MODE获取的锁定。没有什么可以阻止你这样做,在交易之外使用锁是没有多大意义的;因为这些锁是为了保证您选择的值不会改变,直到您要执行的后续查询(如果您想根据另一个表中的值插入/更新数据)

答案 1 :(得分:1)

事务确保所有它包含的命令将成功运行或回滚。

这些类型的select语句会影响其他会话中的其他交易。所以基本上将这些包装在事务中只是你是否选择数据作为更大的命令集的一部分。

如果您只想选择数据,则应使用共享锁或根本不使用锁,无需开始交易。