主要是 公司的项目里面 的 一个 service 方法对事务有着特殊的要求。 比如: 有 A , B , C 3个service 方法, A 方法里面会执行到 B ,C 的方法。
但是要求, C方法如果出现了异常的时候, 让事务 回滚的时候,不要 把B的事务给回滚掉。 而且 A 方法可能被其他的 service 方法给调用到, 其他的方法出现了异常,也是不希望 B的事务被回滚的。 好吧,其实B方法是记录的日志 表,而且是比较重要的内容。如果回滚掉了,就 没有数据了,出现业务起来就比较麻烦了。这个是特殊要求。 而且 项目还使用到 hibernate ,而我对其 不怎么熟悉。。。用的很少,算是 第一次接触。。。 公司的 hibernate 事务配置也有点奇怪。。。
1, 尝试 使用spring不同的事务模式
事务隔离级别:(五种), 事务传播行为:(七种) 等等。。。 我尝试过了,,,什么父子事务啊,,新建事务啊,,,都是没用的,其实 出现了异常还是都会回滚的。而且 是和 事务隔离级别 没有一点关系的。
2 , A service 配置没有事务
也就是使用 : NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 这样 B或者 C 加入事务即可。。。 可是由于是 hibernate 就 出现了其他的异常:
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 的配置什么的,也不是好事。
3, 最后只能手动控制事务了
也就是说 , 在 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 的话,那么就 按照配置的顺序来觉得优先级的,也就是嵌套事务了
直接使用@Order注解来修饰一个切面类,使用 @Order 时可指定一个int型的value属性,该属性值越小,则优先级越高。
http://blog.youkuaiyun.com/jeep_ouc/article/details/43056977