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:最高的隔离级别,事务会顺序执行。