之前在学习过程中,对多表的操作一般添加事务,防止多表操作过程中, 一部分表更改成功, 另一部分表没有更改成功,会出现脏数据。但是最近实习的时候,项目中基本没有事务机制。问了一下师兄,师兄说了以下原因:
- 一般脏数据都出现在测试阶段。如果项目代码逻辑正确(经过严密测试通过),一般不会出现脏数据。
- 很多时候,问题出现在网络延时,这时候即使使用了事务,只会一遍遍重复。
- 加事务会大大增加代码的耗时,而一般脏数据很少出现,出现脏数据时进行数据订正的代价更小。
有没有大佬给指导一下什么时候采用事物,什么时候不需要?
问题描述
问题出现的环境背景及自己尝试过哪些方法
相关代码
粘贴代码文本(请勿用截图)
你师兄说的有点儿道理,但显然没说全。
你师兄说的“数据订正”,显然也不能是人工去订正,那得累死,而是系统自动的补偿机制。
用不用事务就一个原则:当你的操作非原子性、并且一旦出现问题会影响业务流程时,就需要用事务。
原子性就不提了,这你还不知道就建议重读本科了。说下什么叫“会影响业务流程”。
比如微博点赞这个场景(假设他们用的是数据库来存储的),一般会有一个点赞记录表,而被点赞那条评论数据还会有一个汇总点赞数量(为啥会有这个而不是每次临时 COUNT 是另一个问题)。
正常流程来说是,你点赞了,点赞记录表插入一条记录、相应的评论点赞数 +1。你要说这中间出问题了,记录表已经插入了、但点赞数没 +1 怎么办?
不怎么办。这个数真的错了就错了,完全对业务系统不造成什么影响。这个数据完全可以等待一段时间后后台再去补偿修正更新,并不需要时时刻刻显示的都是最真实的那个数值。相反,如果你用了数据库事务,存在锁,会导致并发性能急遽下降,那么面对微博点赞这种瞬时海量操作,什么数据库也扛不住。
另外还有一点,你要分清到底是需要“事务”还是“数据库事务”。上一些规模的业务系统往往是分布式架构,还需要引入分布式事务,而分布式事务往往不依赖数据库事务实现。这是另一个话题了,就不展开了。
最后的最后,抛开场景谈架构都是耍流氓。如果你的业务系统访问量很小,并发量微乎其微,你大可以所有非原子性操作都用数据库事务,只要数据库能扛得住,完全没什么问题呀。这种情况下你要非得上什么补偿机制什么分布式事务,那真是杀鸡用牛刀。