Spring支持两种事务管理:1.编程式事务管理使用TransactionTemplate来在代码中实现2.声明式事务管理:1.基于 tx 和 aop 名字空间的xml配置文件2.基于@Transaction 注解实现,更清爽
事务隔离级别:隔离级别是指若干个并发的事务之间的隔离程度。1.TransactionDefinition.ISOLATION_DEFAULT 默认隔离级别,基本上和ISOLATION_READ_COMMITTED相同。2.TransactionDefinition.ISOLATION_READ_UNCOMMITTED 表示其他事务可以读取另一个事务修改但没提交的数据,会导致脏读,几乎不用。3.TransactionDefinition.ISOLATION_READ_COMMITTED 表示一个事务只能读取另一个事务引进提交的数据,常用的推荐值。4.TransactionDefinition.ISOLATION_REPEATABLE_READ 表示一个事务通过多次重复执行一个查询,得到相同返回结果,来防止脏读和不可重复读。5.TransactionDefinition.ISOLATION_SERIALIZABLE 所有事务依次执行,这就不会有相互干扰,可防止脏读、不可重复读和幻读,但严重影响性能,通常不用。
事务传播行为:指在开始当前事务A之前,一个事务B上下文已经存在,此时有若干选项可以指定一个A的执行行为。1.TransactionDefinition.PROPAGATION_REQUIRED 这是默认值。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。2.TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起。3.TransactionDefinition.PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。4.TransactionDefinition.PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起。5.TransactionDefinition.PROPAGATION_NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。6.TransactionDefinition.PROPAGATION_MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。7.TransactionDefinition.PROPAGATION_NESTED果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。
Spring基于xml文件配置声明式事务:1.定义事务管理器:
2.配置事务属性:<!-- 配置事务的属性 --> <tx:advice id="TestAdvice" transaction-manager="transactionManager"> <!--配置事务传播性,隔离级别以及超时回滚等问题 --> <tx:attributes> <tx:method name="search*" propagation="REQUIRED" read-only="true" isolation="DEFAUT" TIMEOUT="-1" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> </tx:attributes> </tx:advice>
3.配置事务的AOP切入点:<aop:config> <!--配置事务切点 --> <aop:pointcut id="services" expression="execution(public* com.pb.service.*.*(..))" /> <aop:advisor pointcut-ref="services" advice-ref="TestAdvice" /> </aop:config>
Spring 基于注解@Transaction配置声明式事务://将此类进行事务管理 @Transactional public class PersonDaoImpl implements PersonDao { private JdbcTemplate jt; public void setDataSource(DataSource dataSource){ jt = new JdbcTemplate(dataSource); } @Override public void insert(long id, String name, int age) { jt.update("insert into person values('"+id+"','"+name+"','"+age+"')"); } //定义要事务管理的方法,指定传播行为 @Transactional(propagation= Propagation.REQUIRED) public void batchInsert(List persons) { for(Iterator it = persons.iterator(); it.hasNext(); ){ Person p = (Person) it.next(); insert(p.getId(),p.getName(),p.getAge()); } } }