簡短的回答:
是,概率會降低
龍回答:
讓我們弄清楚爲什麼會發生死鎖。當你更新一行時,在這個特定的行上設置排它鎖,它將一直保留,直到你的事務被提交/回滾。 這意味着,沒有其他交易可以更新它 - 它只會阻塞,直到交易完成。當TRAN1願意鎖定行正在舉行的TRAN2TRAN2,反過來,已經被TRAN1
這裏等待鎖定一些行會發生死鎖,並有一個例子:
MariaDB [test]> create table a (id int primary key, value int);
Query OK, 0 rows affected (0.14 sec)
MariaDB [test]> insert into a values (1, 0), (2, 0), (3, 0), (4, 0);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql console 1:
step 1> start transaction;
step 3> update a set value = 1 where id = 2;
step 5> update a set value = 1 where id = 1;
mysql console 2:
step 2> start transaction;
step 4> update a set value = 1 where id = 1;
step 6> update a set value = 1 where id = 2;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
在每次批量更新期間觸及(=更新)的行越多,這種衝突的概率就越高。
您可以通過以明確定義的順序遍歷行來降低此概率。在這種情況下,我提供的簡單例子將不可行。 有關避免死鎖的更多詳細信息,請參閱這篇文章: http://www.xaprb.com/blog/2006/08/03/a-little-known-way-to-cause-a-database-deadlock/
他們是否更新相同的行? – zerkms 2014-09-23 23:38:38
是的,可能會發生這種情況,我正在篩選where子句中的某些行,儘管 – comeOnGetIt 2014-09-23 23:46:15
如果您要更新相同的行 - 肯定會導致死鎖。 – zerkms 2014-09-23 23:47:06