Spring 事务管理

一、事务的基本原理

还记得我们在使用JDBC管理事务的时候是怎样处理的呢?java.sql.Connection

Connection conn = DriverManager.getConnection();
try {  
    conn.setAutoCommit(false);  //将自动提交设置为false                         
    执行CRUD操作 
    conn.commit();      //当两个操作成功后手动提交  
} catch (Exception e) {  
    conn.rollback();    //一旦其中一个操作出错都将回滚,所有操作都不成功
    e.printStackTrace();  
} finally {
    conn.colse();
}

事务是一系列的动作,要么成功、要么失败。一旦其中有一个动作出现错误,必须全部回滚。事务的出现是为了确保数据的完整性和一致性,在目前企业级应用开发中,事务管理是必不可少的。

大家都知道事务具有ACID四大属性。

  • 原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency)事务在完成时,必须是所有的数据都保持一致状态。
  • 隔离性(Isolation)并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。
  • 持久性(Durability)一旦事务完成,数据库的改变必须是持久化的。
二、事务的隔离级别

在多用户访问数据库的时候,会遇到事务的并发处理,可能会出现以下情况:

  • 脏读:一个事务读到另一个事务未提交的更新数据。
  • 不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。
  • 幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
  • 丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

隔离级别越高,意味着数据库事务并发执行性能越差,能处理的操作就越少。你可以通过conn.setTransactionLevel去设置你需要的隔离级别。

三、Spring事务管理

Spring支持编程式事务管理声明式事务管理两种方式。

  • 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

  • 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

更多

Spring事务管理(详解+实例)

你可能感兴趣的:(Spring 事务管理)