选择锁定共享模式

use*_*900 20 mysql innodb locking

从dev.mysql上读过这篇文章.

在该页面中是一个例子,当使用select for update并且不要在共享模式中使用lock并且说

在这里,LOCK IN SHARE MODE不是一个好的解决方案,因为如果两个用户同时读取计数器,当它试图更新计数器,至少有一个用户会死锁

但是本页的第一行说

SELECT ... LOCK IN SHARE MODE:读取的行是最新的,**因此,如果它们属于另一个 尚未提交的事务**,则读取将阻塞,直到该事务结束.

有悖论吗?

我的意思是两个用户不同时读取计数器,因为如果它们属于读取阻止的另一个事务,直到该事务结束.

Max*_*sky 20

如果有另一个已修改行的事务,则SELECT ... LOCK IN SHARE MODE等待.如果未修改该行,则不会等待.这导致了第一种情况,即2个事务可以SELECT ... LOCK IN SHARE MODE,但它们都不能更新记录(死锁)

  • 区别在于您可以在共享模式中选择...锁定的2个交易中选择一个相同的记录,但您不能选择...进行更新.select for update阻止另一个选择更新或在同一记录上选择共享模式锁定. (6认同)

bro*_*and 14

试试这个.打开两个终端,例如Windows中的powershell,xterm,Linux中的控制台,....连接到MySQL:

create table child_codes(取自MySQL文档)

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
Run Code Online (Sandbox Code Playgroud)

我也认为如果其他事务执行查询选择锁定在共享模式下此查询被阻止(等待其他事务提交或回滚).但就像Darhazer提到的那样,如果没有修改行,它就不会等待.我相信在MySQL文档中必须提到这种行为.