2011-07-07 55 views
16

我已阅读this article from dev.mysql在共享模式下选择锁定

在页面

是一个例子,当使用选择更新和不共享模式使用锁,并说

这里,LOCK IN SHARE MODE并不是一个好的 解决方案,因为如果两个用户阅读同时 计数器,其中至少有一个 在僵局结束时 尝试更新计数器

但这个页面的第一行说

SELECT ... LOCK IN SHARE模式: 行读取的最新的数据,**所以 如果他们属于另一个交易** 也没有说但承诺,读取 块,直到该交易结束

有悖论吗?

我的意思是两个用户不要在同一时间东阳 读取计数器,如果他们属于另一个事务读 块,直到交易结束。

回答

18

如果有另一个事务修改了该行,SELECT ... LOCK IN SHARE MODE等待。如果该行未被修改,则不会等待。这导致第一种情况,即2个事务可以选择...锁定在共享模式下,但它们都不能更新记录(死锁)

+0

所以选择更新等待,如果bloked行修改或未由user1修改之前提交并锁定在共享模式等待只有阻止的行由user1修改之前提交? – user677900

+4

区别在于,您可以在共享模式下使用select ... lock在2个事务中选择一个和相同的记录,但不能使用select ...进行更新。选择更新块另一个选择更新或在同一记录上选择锁定共享模式。 –

11

试试这个。打开两个终端PowerShell的Windows中,xterm中,在Linux控制台,....连接到MySQL:

创建表child_codes(从MySQL documentation拍摄)

mysql> create table child_codes (counter_field integer); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into child_codes set counter_field = 1; 
Query OK, 1 row affected (0.00 sec) 

session 1 (terminal 1):    session 2 (terminal 2):                   

              mysql> start transaction; 
              Query OK, 0 rows affected (0.00 sec) 

              mysql> select counter_field from child_codes 
                 lock in share mode; 
              +---------------+ 
              | counter_field | 
              +---------------+ 
              |    1 | 
              +---------------+ 
              1 row in set (0.00 sec) 

mysql> start transaction; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select counter_field from 
      child_codes lock in share mode; 
+---------------+ 
| counter_field | 
+---------------+ 
|    1 | 
+---------------+ 

              mysql> update child_codes set counter_field = 2; 
              ERROR 1205 (HY000): Lock wait timeout exceeded; 
              try restarting transaction 

我也认为,如果其它事务执行查询共享锁选择模式下查询被阻塞(等待其他事务提交或回滚)。但是像达哈泽提到的如果该行没有被修改,它不会等待。我相信这个行为必须在MySQL文档中提及。

+0

这个例子似乎是不切实际的,与“*其他会话可以读取行,但在你的事务提交之前不能修改它们,如果这些行中的任何一行被另一个尚未提交的事务改变了,你的查询就会等待事务结束,然后使用最新值。*“如果另一个事务释放了锁,则不应检测到阻塞或死锁。 http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html – Tiny

相关问题