死锁及其解决方法
用户转账时的死锁如何出现
假设table的字段是[user, money]
,用户1
给用户2
转账10¥,过程如下:
1、进入事务,锁住用户1
那一行数据,判断用户1
的money是否不少于10,如果是,则扣除10并继续,否则退出事务。
2、锁住用户2
那一行数据,并加10。 3、释放锁,commit。
不过与此同时,用户2
给用户1
转账20¥,过程如下:
1、进入事务,锁住用户2
那一行数据,判断用户2
的money是否不少于20,如果是,则扣除10并继续,否则报错。
2、锁住用户1
那一行数据,并加20。 3、释放锁,commit。
因为涉及到修改,所以是事务中使用的锁都是排他锁。
如果这两个事务同时进入第2步,则会发生死锁。
用户转账时的死锁如何解决
方法1、
定期运行死锁检测程序,发现死锁时,取消其中一个事务。
方法2、
由于进入转账事务时候已经确定是锁住哪两个用户了,所以按顺序锁住用户即可。例如用户A和用户B,无论是谁跟谁转账,都先锁A,再锁B。