我有一笔交易需要一段时间才能完成。我想保护受影响的行不从当前事务外部更新这样做的最佳做法是什么?首先,如果事务之外的其他查询仍然可以读取行,这样我的应用程序在执行工作时就不会执行完全的hold。当事务开始时,我将更改/更新每行一列中的值,这样它就可以进行写锁定了,对吗?当前事务之外的其他查询仍然可以读取行(我不关心是否提取旧值或新值),但不能写入行?当当前事务完成时,写锁被释放,其他查询可以再次写入行吗?这是最好的做法还是有更好的办法?我对所有表都使用innodb引擎
bybem2ql1#
SELECT ... FOR SHARE 可能就是你要找的。从mysql文档:在读取的任何行上设置共享模式锁。其他会话可以读取行,但在事务提交之前不能修改它们。如果这些行中的任何一行被另一个尚未提交的事务更改,则查询将等待该事务结束,然后使用最新的值。在交易开始时 SELECT ... FOR SHARE 您计划更新的所有行,然后继续实际更新。
SELECT ... FOR SHARE
1条答案
按热度按时间bybem2ql1#
SELECT ... FOR SHARE
可能就是你要找的。从mysql文档:在读取的任何行上设置共享模式锁。其他会话可以读取行,但在事务提交之前不能修改它们。如果这些行中的任何一行被另一个尚未提交的事务更改,则查询将等待该事务结束,然后使用最新的值。
在交易开始时
SELECT ... FOR SHARE
您计划更新的所有行,然后继续实际更新。