在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional
,Spring就可以自动帮我们进行事务的开启、提交、回滚操作。甚至很多人心里已经将Spring事务与@Transactional
划上了等号,只要有数据库相关操作就直接给方法加上@Transactional
注解。
不瞒你说,我之前也一直是这样,直到使用@Transactional
导致了一次生产事故,而那次生产事故还导致我当月绩效被打了D...
@Transactional
导致的生产事故19年在公司做了一个内部报销的项目,有这样一个业务逻辑:
1、员工加班打车可以通过滴滴出行企业版直接打车,第二天打车费用可以直接同步到我们的报销平台
2、员工可以在报销平台勾选自己打车费用并创建一张报销单进行报销,创建报销单的同时会创建一条审批流(统一流程平台)让领导审批
当时创建报销单的代码是这么写的:
OrderService.java
public void createOrder(OrderCreateDTO createDTO){
OrderService orderService = (OrderService)AopContext.currentProxy();
orderService.saveData(createDTO);
}
使用@Transactional
注解在开发时确实很方便,但是稍微不注意就可能出现长事务问题。所以对于复杂业务逻辑,我这里更建议你使用编程式事务来管理事务,当然,如果你非要使用@Transactional
,可以根据上文提到的两种方案进行方法拆分。