主要是 公司的项目里面 的 一个 service 方法对事务有着特殊的要求。 好比: 有 A , B , C 3个service 方法, A 方法里面会执行到 B ,C 的方法。spring
可是要求, C方法若是出现了异常的时候, 让事务 回滚的时候,不要 把B的事务给回滚掉。 并且 A 方法可能被其余的 service 方法给调用到, 其余的方法出现了异常,也是不但愿 B的事务被回滚的。 好吧,其实B方法是记录的日志 表,并且是比较重要的内容。若是回滚掉了,就 没有数据了,出现业务起来就比较麻烦了。这个是特殊要求。 并且 项目还使用到 hibernate ,而我对其 不怎么熟悉。。。用的不多,算是 第一次接触。。。 公司的 hibernate 事务配置也有点奇怪。。。安全
事务隔离级别:(五种), 事务传播行为:(七种) 等等。。。 我尝试过了,,,什么父子事务啊,,新建事务啊,,,都是没用的,其实 出现了异常仍是都会回滚的。并且 是和 事务隔离级别 没有一点关系的。测试
也就是使用 : NOT_SUPPORTED--以非事务方式执行操做,若是当前存在事务,就把当前事务挂起 这样 B或者 C 加入事务便可。。。 但是因为是 hibernate 就 出现了其余的异常:.net
Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. could not initialize proxy - no Session
总之和 hibernate 特性有关系的,,,好吧, 不懂了,并且 随便去 修改 hibernate 的配置什么的,也不是好事。hibernate
也就是说 , 在 A方法里面, 调用 B方法的时候, 手动提交它的事务。 关于这个百度就不少资料了。日志
@Resource(name = "transactionManager") // 配置hibernate的 事务管理区的bean id private HibernateTransactionManager transactionManager; // 例子 手动提交 public void testx() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 得到事务状态 try { UserBank userBank = userBankService.getUserBankById(10L); userBank.setBankname("66测试66666666"); userBankService.update(userBank);// bankservice 里面是有事务的 System.out.println("==================66》》》》》》》》》》》》"); int aString = 1; if (aString == 2) { throw new NullPointerException("我是异常"); } System.out.println("===================提交"); transactionManager.commit(status); } catch (Exception e) { e.printStackTrace(); System.out.println("===================回滚"); transactionManager.rollback(status); } } 固然为了 减小影响, 应该 A和C 的 方法配置的事务 最好是 REQUIRES_NEW--新建事务,若是当前存在事务,把当前事务挂起。 通过测试 ,, 能够 解决。
若是声明式事务和 注解事务 一块儿共存的执行优先级: 若是不指定order 的话,那么就 按照配置的顺序来以为优先级的,也就是嵌套事务了code
直接使用@Order注解来修饰一个切面类,使用 @Order 时可指定一个int型的value属性,该属性值越小,则优先级越高。blog