2014-09-23 205 views
1

當我嘗試執行批量更新時,出現以下異常。有多個同時運行的線程可能正在訪問數據庫中的一行。我正在做多個批量更新。任何人都可以評論批量和僵局之間的關係嗎?通過減少批量(當前批量= 1000),死鎖的概率會下降嗎?死鎖mysql多個批量更新操作

我得到的例外是

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 
+0

他們是否更新相同的行? – zerkms 2014-09-23 23:38:38

+0

是的,可能會發生這種情況,我正在篩選where子句中的某些行,儘管 – comeOnGetIt 2014-09-23 23:46:15

+0

如果您要更新相同的行 - 肯定會導致死鎖。 – zerkms 2014-09-23 23:47:06

回答

0

簡短的回答

是,概率會降低

龍回答

讓我們弄清楚爲什麼會發生死鎖。當你更新一行時,在這個特定的行上設置排它鎖,它將一直保留,直到你的事務被提交/回滾。 這意味着,沒有其他交易可以更新它 - 它只會阻塞,直到交易完成。當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/