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,但它们都不能更新记录(死锁)
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文档中必须提到这种行为.
| 归档时间: |
|
| 查看次数: |
13060 次 |
| 最近记录: |