我试图找到锁定共享模式和锁定更新之间的中间地带。
只要尚未更新正在修改的行,就可以通过两个不同的事务获取共享模式中的锁。这在以下情况中很糟糕:
我可以使用的替代方法是锁定更新,但这对我的应用程序来说限制太多,因为我不关心我的用户是否读取了10秒的值。所以我永远不想使用锁来进行更新。
问题:我可以使用哪个锁:
示例:
编辑: 我使用NDB集群作为我的存储引擎。 服务器版本:5.1.56-ndb-7.1.15a-cluster-gpl-log MySQL Cluster Server(GPL)
答案 0 :(得分:1)
如果不了解您正在做的事情,很难确切地知道推荐。但是这里有几个指针可能会帮助您找到答案。
首先,正常的SELECT ... FROM ...
不会对任何行进行任何锁定,并提供一致的读取 - - 也就是说,它根据SELECT语句开始时数据库中的内容提供结果集。
这一点很重要,因为锁定唯一的问题是:
SELECT
语句中间完成更新,以反映在结果中。 (我不确定为什么这会有效。)其次,为其他类型的语句(例如SELECT ... FROM ... LOCK IN SHARE MODE
)锁定的行将取决于用于选择要更新的行的INDEXES。基本上,扫描所有行以查找行的行将被锁定。
这很重要,因为您可以通过制作索引来显着减少锁定的行数,这些索引允许您的UPDATE
语句选择要直接更新的行。例如,如果您可以在表上创建UNIQUE
索引,然后在运行更新时让UPDATE语句命中INDEX,则只会阻止该行。
所以我遇到锁定问题的最好的运气是获取这两条信息 - 1)普通的SELECTS没有做任何锁定,2)我可以定义好的索引来最小化那些行实际上确实被锁定 - 然后设计导致没有锁定冲突的sql。
这是一个指向页面的链接,该页面始终帮助我解决锁定时遇到的任何问题。它具体描述了生成锁的每种语句以及它们是什么类型的锁:Locks Set by Different SQL Statements in InnoDB
答案 1 :(得分:0)
您使用的是MyISAM还是InnoDB?我建议使用InnoDB并使用MVCC的事务隔离级别来实现所需的并发级别。
由于MVCC,InnoDB中的正常选择不会锁定。所以你永远不会阻止读者。