版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接:https://blog.csdn.net/qq_18860653/article/details/79907984
问题描述
在使用Spring 事务的时候,加上了timeout的限制,@Transactional(timeout = 10),发现事务不会由于超时回滚。数据库
功能描述
所谓事务超时,就是指一个事务所容许执行的最长时间,若是超过该时间限制但事务尚未完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
默认设置为底层事务系统的超时值,若是底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。.net
问题缘由
Spring事务超时 = 事务开始时到最后一个Statement建立时时间 + 最后一个Statement的执行时超时时间(即其queryTimeout)。因此在在执行Statement以外的超时没法进行事务回滚。blog
解决办法
举个例子事务
@Transactional(timeout = 2, rollbackFor = Exception.class,isolation = Isolation.DEFAULT)
public void createOrder(Integer userId, Integer goodsId, Integer amount) throws Exception {
//减小库存
int result = goodsDao.updateGoodsStock(goodsId, amount);
if (result != 1) {
throw new Exception("建立订单失败");
}
//制造异常
// int i = 1/0;
//插入订单
orderDao.insert(userId, goodsId, amount);
Thread.sleep(3000);
}
在段代码中,若是把Thread.sleep(3000);放到最后,并不会回滚。因此开发的时候要特别注意。若是真的有特别重要的操做(在最后一个Statement以后),我如今的解决办法是,
* 尽可能在执行Statement的中间
* 在操做的最后再加一个无关的轻量Statement操做开发
原理
有时间在看,确定是Spring AOP里面的it