spring事务深入理解和案例分析

http://www.cnblogs.com/fjdingsd/p/5632949.html 参考文档

<!-- 事务相关配置 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED" read-only="false" isolation="READ_UNCOMMITTED" 
				rollback-for="java.lang.Exception" />
			<tx:method name="save*" propagation="REQUIRED" read-only="false" isolation="READ_UNCOMMITTED" 
				rollback-for="java.lang.Exception" />
			<tx:method name="update*" propagation="REQUIRED" read-only="false" isolation="READ_UNCOMMITTED" 
				rollback-for="java.lang.Exception" />
			<tx:method name="modify*" propagation="REQUIRED" read-only="false" isolation="READ_UNCOMMITTED" 
				rollback-for="java.lang.Exception" />
			<tx:method name="delete*" propagation="REQUIRED" read-only="false" isolation="READ_UNCOMMITTED" 
				rollback-for="java.lang.Exception" />
		</tx:attributes>
	</tx:advice>



//propagation="REQUIRED":spring配置事务的传播属性,spring默认的传播属性就是这个。如果当前没有事务就创建一个新的事务,如果当前已经有事务直接加入到现有的事务。

//isolation="READ_UNCOMMITTED":spring配置事务的隔离级别为未提交的读,这样会产生脏读。比如线程1需要更新订单备注为1但是还没有提交,线程2这个时候在另一个事务中可以读取到订单备注为1。




	<!-- 事务相关配置 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/> 


 @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED)  
    @Override
    public void updateOrderMemoInfo(Map<String, Object> params) {

}



//基于注解的事务配置,配置当前事务传播属性为REQUIRED,事务的隔离级别为READ_COMMITTED




//事务的传播属性

//REQUIRED:支持当前事务,如果当前没有事务就新建一个事务,这个是spring默认的传播属性。

//REQUIRES_NEW:每次都新建一个事务,如果当前已经有事务,会把当前事务挂起。新建的事务和当前事务没有任何关系,是两个完全独立的事务。外层事务失败后不会影响内层事务,内层失败失败也可以不影响外层事务。

//SUPPORTS:支持当前事务,如果当前没有事务,就以非事务的方式运行。

//NOT_SUPPORTED:以非事务的方式运行,如果当前有事务,则把当前事务挂起。

//NEVER:以非事务的方式运行,如果当前有事务,则抛出异常。



//数据库事务的隔离级别

//Read-Uncommitted:未提交读。一个事务修改了数据但是事务还没有提交,另一个事务读取到了未提交的数据,这样会导致脏读。

//Read-Committed:提交读。一个事务两次读取同一条数据,另一个事务在第一次读后修改了该数据,会导致第一个事务两次读取到的数据不一致,导致不可重复读。可以避免了脏读

//Repeatable-Read:第一个事务修改了一定范围内的数据,第二个事务在这个范围内新增的了一条数据,会导致第一个事务少更新了一条数据,从而导致幻读。可以避免脏读和不可重复读。

//Serializable:所有事务都是串行话的一个一个的去执行,可以避免脏读、不可重复读、幻读。最高的隔离级别。

//总结:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,



//spring事务的隔离级别

//DEFAULT:spring默认的隔离级别,默认使用数据库的隔离级别。

//READ_UNCOMMITTED:允许一个事务读取到另一个事务还没有提交的数据,会产生脏读。

//READ_COMMITTED:能够保证一个事务提交了才能被另一个事务读取。

//REPEATABLE_READ:可以防止脏读、不可重复读

//SERIALIZABLE:最高的隔离级别,事务会顺序执行。

猜你喜欢

转载自13813962825.iteye.com/blog/2389801