事务

数据库事务:原子性、一致性、独立性(事务串行)、持久性

1. 死锁(dead lock)分析

mysql死锁必然出现在事务中,而且是两个事务相互等待对方事务的提交(等待对方的锁释放),一般就是对同一行记录的乱序修改导致的。例如:

Tx 1: lock A, then B
Tx 2: lock B, then A

上次在项目中,出现了dead lock的原因:

1)有一个seq表产生序列,序列是按照<日期yyyyMMdd,文件类型缩写>来自增生成的编号。一致性保证是靠CAS来做的。

2)在一个大的Transaction中,会对若干个文件进行文件编号的生成。而文件的类型的顺序来自于用户的输入,因而顺序是随机的不可预知的。假设有两条线程Thread1和Thread2,分别为文件类型A和B生成编号。

3)死锁的过程:Thread1为文件类型A生成编号,锁住了<当天,A>的seq表行;然后Thread2为文件类型B生成编号,锁住了<当天,B>的seq表行;然后Thread1需要为文件类型B生成编号,所以Thread1等待Thread2解锁;而此时,Thread2也需要为文件类型A生成编号,所以Thread2等待Thread1解锁,此时就产生了死锁。

4)发生死锁时,mysql只能丢弃其中一个事务(让其回滚),然后让另外一个事务完成。这时候一个任务会失败,只能等待重试来完成。

文档更新时间: 2018-11-10 17:07   作者:nick