开发者社区> 问答> 正文

MySQL:事务与锁定表

我对事务与锁定表有些困惑,以确保数据库完整性,并确保SELECT和UPDATE保持同步,并且没有其他连接干扰它。我需要:

SELECT * FROM table WHERE (...) LIMIT 1

if (condition passes) { // Update row I got from the select UPDATE table SET column = "value" WHERE (...)

... other logic (including INSERT some data) ... } 我需要确保没有其他查询会干扰并执行相同的操作SELECT(在该连接完成更新行之前读取“旧值”。

我知道我可以默认为LOCK TABLES table只确保一次只有1个连接正在执行此操作,并在完成后将其解锁,但这似乎有点过头了。将它包装在事务中是否会做同样的事情(确保没有其他连接会尝试同一进程而另一个仍在处理)?或将一个SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE更好?

展开
收起
保持可爱mmm 2020-05-17 20:44:07 924 0
1 条回答
写回答
取消 提交回答
  • 如您所说,您希望在事务中SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE事务内部,因为通常SELECT(无论它们是否在事务中)都不会锁定表。您选择哪一项取决于您是否希望其他事务在事务进行过程中能够读取该行。

    http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

    START TRANSACTION WITH CONSISTENT SNAPSHOT不会帮您的忙,因为其他交易仍然可以进行并修改该行。在下面链接的顶部提到了这一点。

    如果其他会话同时更新同一张表,您可能会看到该表处于数据库中从未存在的状态。

    http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html来源:stack overflow

    2020-05-17 20:51:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像