分享

SpringMVC 手动控制事务提交

 quasiceo 2018-09-08

在springmvc的开发中,有个比较扯的东西,就是当你在代码中新开了一个线程,那么这个线程里面将不会有事物的存在.


1至于为何不会有事物的存在: 因为我们的事物都是有springmvc统一管理,而你新开了个线程,并没有提交给springmvc进行统一的管理.所以,如果没有手动申明,是不会有事物的存在的.



解决..


这样就可以提供事物支持了..

在需要加事务的方法上加上

DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx
.getBean("txManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。
TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
try {
//逻辑代码,可以写上你的逻辑处理代码
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}

这是在有 ApplicationContext 的情况下、

 

ApplicationContext 不存在的情况下

 

    @Autowired

    private DataSourceTransactionManager txManager;

 

   DefaultTransactionDefinition def = new DefaultTransactionDefinition();

   def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔离级别,开启新事务

   TransactionStatus status = txManager.getTransaction(def); // 获得事务状态

try{
//逻辑代码,可以写上你的逻辑处理代码
txManager.commit(status);
}catch(Exception e){
txManager.rollback(status);
}





在这里,其实还有另外一个坑

特别需要注意,如果这里开启了事物.没有提交,也没有回滚,没有关闭,

这个时候,服务器并不会抛出什么异常, 刚开始运行也不会有什么错误,一切运行皆正常,

当这个事物开启到一定程度后,服务器就会像死了一样,不处理其他的事物, 但是又没有挂,

反正当时很诡异,当初我们找了好久,才想起就改了这个地方, 特意写上这里,下次千万注意!!


所以,当开启了事物后,一定要提交或者关闭,或者回滚.....

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多