本文讨论了大事务的定义、影响及处理方法。大事务涉及多表操作,一旦某个操作超时或缓慢,会锁定所有相关表,影响性能。以银行转账为例,必须确保所有步骤同时成功。大事务可拆分为小事务以快速释放锁,避免锁等待超时,提高系统吞吐率。同时,建议将查询语句放在事务外处理。
大事务指的是我们有一个业务,它设计了很多操作,所有的操作要么全部成功,要么全部失败,不能一部分操作成功,一个部分操作失败,当这些操作涉及过多的数据库表,如果有一个sql超时,或者执行缓慢,会把事务里面涉及到的表都锁住,性能严重受到影响。
举个例子,最常见的例子是银行转账:
需求
张三向李四转账200,李四的余额增加200,张三的余额减少200
操作步骤
1. 检查张三账户,进行余额扣减
2.银行调用转账接口
3.检查李四账户,余额增加
这个转账的动作,一定是要1,2,3步骤同时成功,才能算转账这个动作成功,只要有一个步骤失败,转账操作就是失败,如果这三个步骤,设计到很多数据库表的操作,如果有一个sql超时,没有及时释放表锁,就会导致其他客户端的锁等待超时,整个系统都会受到影响。
事实上,事务的目的是为了保证数据的原子性,准确性,那么也就是说,只要你需要保证的数据做到了,就可以进行事务提交了。所以,可以将大事务拆小,即保证最小事务的执行即可。如:更新一个用户的会员状态,那么只需要查出相关信息,更改状态,写入相应记录,该事务即可提交。
将大事务拆小后,就可以做到快速释放锁的作用,从而避免了其他客户端的锁等待超时问题了。
把查询相关的语句,放到事务外处理
拆分事务的目的是为了快速释放锁,避免死锁,提高程序的吞吐率
推荐阅读