用户转账如何解决死锁问题

死锁及其解决方法

维基百科 - 死锁
死锁的产生、预防和避免

用户转账时的死锁如何出现

假设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。

转载于:https://my.oschina.net/letiantian/blog/524939

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值