使用Spring+JPA,今天在进行一个业务处理的时候发现一个方法已经设置事物超时时间为3秒,但是到达3秒的时候程序一直不返回,处于hold状态.
使用org.springframework.orm.jpa.JpaTransactionManager事务管理器:
下面方法的执行时间一定是超多事务设置的3秒的,但是并没有触发事务的超时回滚.
public List<Mobile> myTest() { List<Mobile> allNormalMobile = mobileRepository.findByDeleteFlag(DeleteFlagEnum.NORMAL.getStatus()); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return allNormalMobile ; }
分析:
https://www.iteye.com/blog/jinnianshilongnian-1986023
Spring事务超时 = 事务开始时到最后一个Statement创建时时间 + 最后一个Statement的执行时超时时间(即其queryTimeout)。
假设事务超时时间设置为3s,查询需要5s才能执行完.
public List<Mobile> myTest() { List<Mobile> allNormalMobile = mobileRepository.findByDeleteFlag(DeleteFlagEnum.NORMAL.getStatus()); return allNormalMobile ; }
虽然上面代码会触发spring的事务超时,但是这个超时需要5秒之后(查询完成之后)才会触发,不会第三秒中断查询触发事务超时.
前提: 以下代码事务超时时间为3秒,每个查询耗时1秒.
以下代码会触发超时
public List<Mobile> myTest() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } List<Mobile> allNormalMobile = mobileRepository.findByDeleteFlag(DeleteFlagEnum.NORMAL.getStatus()); return allNormalMobile; }
@Override public List<Mobile> myTest() { List<Mobile> allNormalMobile = mobileRepository.findByDeleteFlag(DeleteFlagEnum.NORMAL.getStatus()); try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } List<Mobile> vendorMobiles = mobileRepository.findByVendorIdAndDeleteFlag(2, DeleteFlagEnum.NORMAL.getStatus()); return vendorMobiles; }
以下代码不会触发超时:
@Override public List<Mobile> myTest() { List<Mobile> allNormalMobile = mobileRepository.findByDeleteFlag(DeleteFlagEnum.NORMAL.getStatus()); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return allNormalMobile; }
一下代码不会触发超时
相关文章:
还没有评论,来说两句吧...