事务的超时回滚
什么是超时回滚
- 如果一个事务执行的时间超过某个时间限制,就让该事务回滚。
- 可以通过设置事务超时回顾来实现。
基本语法
@Transactional(timeout = 时间)
代码演示
@Transactional( propagation=propagation.REQUIRES_NEW, //设置事务传播属性 isolation=Isolation.READ_COMMITTED, //设置隔离级别 timeout=2 //设置事务超时时间 )
超时回滚-实例代码实现
修改GoodsService.java ,增加buyGoodsByTxTimeout()
测试事务的超时回滚(超时时间,我们设置为2 秒)
@Transactional(timeout = 2) public void buyGoodsByTxTimeout(int user_id, int goods_id, int num) { //查询到商品价格 Float goods_price = goodsDao.queryPriceById02(goods_id); //购买商品,减去余额 goodsDao.updateBalance02(user_id, goods_price * num); System.out.println("====超时start===="); try { Thread.sleep(4000); //休眠4秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("====超时end===="); //更新库存 goodsDao.updateAmount02(goods_id, num); }
测试TxTest.java, 增加测试方法
//测试购买商品(使用了声明式事务, 测试事务超时回滚) @Test public void buyGoodsByTxTimeoutTest() { ApplicationContext ioc = new ClassPathXmlApplicationContext("tx_ioc.xml"); GoodsService bean = ioc.getBean(GoodsService.class); bean.buyGoodsByTxTimeout(1, 1, 1); System.out.println("------ok--------"); }
会抛出异常,事务进行回滚,原来的操作将会撤销
Transcation timed out : deadline was …