spring 事务的理解和控制剥离实践

主要是 公司的项目里面 的 一个 service 方法对事务有着特殊的要求。 好比: 有 A , B , C 3个service 方法, A 方法里面会执行到 B ,C 的方法。spring

可是要求, C方法若是出现了异常的时候, 让事务 回滚的时候,不要 把B的事务给回滚掉。 并且 A 方法可能被其余的 service 方法给调用到, 其余的方法出现了异常,也是不但愿 B的事务被回滚的。 好吧,其实B方法是记录的日志 表,并且是比较重要的内容。若是回滚掉了,就 没有数据了,出现业务起来就比较麻烦了。这个是特殊要求。 并且 项目还使用到 hibernate ,而我对其 不怎么熟悉。。。用的不多,算是 第一次接触。。。 公司的 hibernate 事务配置也有点奇怪。。。安全

1, 尝试 使用spring不一样的事务模式

事务隔离级别:(五种), 事务传播行为:(七种) 等等。。。 我尝试过了,,,什么父子事务啊,,新建事务啊,,,都是没用的,其实 出现了异常仍是都会回滚的。并且 是和 事务隔离级别 没有一点关系的。测试

2 , A service 配置没有事务

也就是使用 : 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

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 的话,那么就 按照配置的顺序来以为优先级的,也就是嵌套事务了code

直接使用@Order注解来修饰一个切面类,使用 @Order 时可指定一个int型的value属性,该属性值越小,则优先级越高。blog

http://blog.csdn.net/amyson/article/details/4142206事务

http://blog.csdn.net/jeep_ouc/article/details/43056977rem

相关文章
相关标签/搜索