我对事务与锁定表有些困惑,以确保数据库完整性,并确保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更好?
如您所说,您希望在事务中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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。