代码之家  ›  专栏  ›  技术社区  ›  clarkk

mysql-运行事务时锁定行

  •  1
  • clarkk  · 技术社区  · 6 年前

    我有一笔交易要花一段时间才能完成。我希望保护受影响的行不被当前事务外部的更新

    最佳实践是什么?

    首先,如果事务外部的其他查询仍然可以读取行,这样我的应用程序在执行工作时就不会完全保留。

    当事务启动时,我将更改/更新每行一列中的一个值,这样它将产生一个写锁,对吗?当前事务之外的其他查询仍然可以读取行(我不关心是否提取旧值或新值),但不写入它们?

    当当前事务完成时,写锁被释放,其他查询可以再次写入行吗?

    这是最佳实践还是有更好的方法?

    我对所有表都使用innodb引擎

    1 回复  |  直到 6 年前
        1
  •  0
  •   kristaps    6 年前

    SELECT ... FOR SHARE 可能是你想要的。从 MySQL docs :

    对任何读取的行设置共享模式锁。其他会话可以读取行,但在事务提交之前不能修改它们。如果这些行中的任何一行被另一个尚未提交的事务更改,则查询将一直等到该事务结束,然后使用最新的值。

    在交易开始时, 选择…为了分享 您计划更新的所有行,然后继续实际更新。