声明式事务是spring处理事务的标志性方式,它是在TransactionDefinition 接口中定义各种各样的事务属性,然后通过TransactionProxyFactoryBean类或者TransactionInterceptor类或者<tx>和<aop>标签来在配置文件中进行事务属性在目标对象目标方法上的配置声明,以供PlatfromTransactionManager使用,PlatfromTransactionManager 是 spring 事务管理的核心接口,不同的持久化技术各自都有它的实现类,如hibernate的就是HibernateTransactionManager。 声明式事务的好处是,使
我们从复杂的事务处理中得到解脱。使得我们再也无需去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需我们在与事务相关的方法中处理大量的 try … catch … finally 代码。
事务属性通常由事务的隔离级别,传播属性,事务的超时值,事务的只读标志以及事务的回滚策略组成。
1.事务的隔离级别: ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用后台数据库默认的事务隔离级别.
ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许你读取未提交的数据,这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。可以防止脏读,但是还可能发生不可重复读和幻读。
ISOLATION_REPEATABLE_READ: 这种事务隔离级别除了保证一个事务不能读取另一个事务未提交的数据外,还保证了一个事务对相同字段的多次读取结果都是一致的,除非数据被事务本身改变。可以防止脏读,不可重复读。但是可能出现幻像读。
ISOLATION_SERIALIZABLE:这是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。但是它的代价也是最高的。
2.事务的传播特性: PROPAGATION_REQUIRED: 表示当前方法必须运行在一个事务中。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,就要开始一个新的事务。
PROPAGATION_SUPPORTS:表示当前方法支持但不需要事务处理环境。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,该方法就在非事务环境下运行。
PROPAGATION_MANDATORY:表示该方法强制性的运行在事务环境中。如果运行环境中已有一个事务在运行,该方法就运行在这个事务中,否则,就抛出异常。
PROPAGATION_REQUIRES_NEW:表示该方法总是运行在它自己的事务中。如果运行环境中已有一个事务在运行,则将原来事务挂起。
PROPAGATION_NOT_SUPPORTED:表示该方法总是运行在非事务环境中。如果运行环境中已有一个事务在运行,则将原来的事务挂起。
PROPAGATION_NEVER:表示该方法总是运行在非事务环境中。如果运行环境中已有一个事务在运行,则将抛出异常。
PROPAGATION_NESTED:表示该方法可以运行在嵌套事务中。如果运行环境中已有一个事务在运行,则该方法运行在一个嵌套事务中。运行在嵌套事务中的方法可以从当前事务中单独的进行提交或回滚。否则,它跟PROPAGATION_REQUIRED的性质是一样的。
3.事务的只读标志: readOnly:由于事务操作最终都是由后台数据库来具体实施的,配置了readOnly的方法在进行数据库操作时会采取一些优化措施,比如避免脏数据检查等。注意,如果使用hibernate,还要把该方法的flush模式设置成FLUSH_NEVER,如:template.setFlushMode(HibernateTemplate.FLUSH_NEVER);
另外,我们不难发现,只有将那些可能产生新事务的方法的事务配置成readOnly才有意义(传播属性为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。
spring默认没有只读标志。
4.事务的超时策略: 假设你的事务在预料之外长时间运行,因为事务可能设计对后台数据库的锁定,长时间运行的事务会不必要的占用数据库自愿。与其等它结束,不如声明一个事务,在指定时间内不结束就自动回滚。
由于超时策略是在事务启动时就开始计时,所以也只有将那些可能产生新事务的方法的事务配置成readOnly才有意义(传播属性为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。
5.事务的回滚策略: spring默认的回滚策略是:发生异常不一定回滚,只有发生运行时异常才回滚。但是,我们可以在配置文件中对具体异常类型的回滚策略进行控制,并且前面带"+"表示提交,带"-"表示回滚。
本文出自 “夜狼” 博客,请务必保留此出处http://yangfei520.blog.51cto.com/1041581/267766