Spring事务总结

事务特性

  • 原子性(Atomicity):事务是一个原子操做,由一系列动做组成。事务的原子性确保动做要么所有完成,要么彻底不起做用。
  • 一致性(Consistency):一旦事务完成(无论成功仍是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不该该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,所以每一个事务都应该与其余事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,不管发生什么系统错误,它的结果都不该该受到影响,这样就能从任何系统崩溃中恢复过来。一般状况下,事务的结果被写到持久化存储器中

 

Spring事务管理核心接口

 

基本事务属性定义

   

public interface TransactionDefinition {
    // 返回事务的传播行为 
    default int getPropagationBehavior() {
       return PROPAGATION_REQUIRED;
     } 
     // 返回事务的隔离级别,事务管理器根据它来控制另一个事务能够看到本事务内的哪些数据
     default int getIsolationLevel() {
         return ISOLATION_DEFAULT;
     } 
     // 返回事务必须在多少秒内完成
     default int getTimeout() {
        return TIMEOUT_DEFAULT;
     };  
     // 事务是否只读,事务管理器可以根据这个返回值进行优化
     default boolean isReadOnly() {
        return false;
     } 
} 

 

  • 传播行为

       事务的第一个方面是传播行为(propagation behavior)。当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在本身的事务中运行。Spring定义了七种传播行为java

 
传播行为
含义
PROPAGATION_REQUIRED
表示当前方法必须运行在事务中。若是当前事务存在,方法将会在该事务中运行。不然,会启动一个新的事务
PROPAGATION_SUPPORTS
表示当前方法不须要事务上下文,可是若是存在当前事务的话,那么该方法会在这个事务中运行
PROPAGATION_MANDATORY
表示该方法必须在事务中运行,若是当前事务不存在,则会抛出一个异常
PROPAGATION_REQUIRED_NEW
表示当前方法必须运行在它本身的事务中。一个新的事务将被启动。若是存在当前事务,在该方法执行期间,当前事务会被挂起。
PROPAGATION_NOT_SUPPORTED
表示该方法不该该运行在事务中。若是存在当前事务,在该方法运行期间,当前事务将被挂起。
PROPAGATION_NEVER
表示当前方法不该该运行在事务上下文中。若是当前正有一个事务在运行,则会抛出异常
PROPAGATION_NESTED
表示若是当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务能够独立于当前事务进行单独地提交或回滚。若是当前事务不存在,那么其行为与PROPAGATION_REQUIRED同样。注意各厂商对这种传播行为的支持是有所差别的。能够参考资源管理器的文档来确认它们是否支持嵌套事务
 
  • 隔离级别

        事务的隔离级别定义一个事务可能受其余并发务活动活动影响的程度。数据库

隔离级别
含义
ISOLATION_DEFAULT
使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED
最低的隔离级别,容许读取还没有提交的数据变动,可能会致使脏读、幻读或不可重复读
ISOLATION_READ_COMMITTED
容许读取并发事务已经提交的数据,能够阻止脏读,可是幻读或不可重复读仍有可能发生
ISOLATION_REPEATABLE_READ
对同一字段的屡次读取结果都是一致的,除非数据是被自己事务本身所修改,能够阻止脏读和不可重复读,但幻读仍有可能发生
ISOLATION_SERIALIZABLE
最高的隔离级别,彻底服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,由于它一般是经过彻底锁定事务相关的数据库表来实现的
  • 只读

        若是一个事务只对数据库执行读操做,那么该数据库就可能利用那个事务的只读特性,采起某些优化措施。经过把一个事务声明为只读,能够给后端数据库一个机会来应用那些它认为合适的优化措施。因为只读的优化措施是在一个事务启动时由后端数据库实施的, 所以,只有对于那些具备可能启动一个新事务的传播行为(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED)的方法来讲,将事务声明为只读才有意义。
  • 事务超时

         为了使一个应用程序很好地执行,它的事务不能运行太长时间。所以,声明式事务的下一个特性就是它的超时。假设事务的运行时间变得格外的长,因为事务可能涉及对数据库的锁定,因此长时间运行的事务会没必要要地占用数据库资源。这时就能够声明一个事务在特定秒数后自动回滚,没必要等它本身结束。因为超时时钟在一个事务启动的时候开始的,所以,只有对于那些具备可能启动一个新事务的传播行为(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)的方法来讲,声明事务超时才有意义。
  • 回滚规则

       默认状况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的可是你能够声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。一样,你还能够声明事务遇到特定的异常不回滚,即便这些异常是运行期异常。后端

相关文章
相关标签/搜索