Spring事务管理的核心接口

来源:互联网 发布:pop3默认端口号 编辑:程序博客网 时间:2024/05/21 10:20
Spring事务管理高层抽象主要包括3个接口
  1. PlatformTransactionManager 事务管理器
  2. TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
  3. TransactionStatus 事务具体运行状态
  1. 关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.

1.PlatformTransactionManager 事务管理器



  •  Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现

事务

说明

org.springframework.jdbc.datasource.DataSourceTransactionManager

使用Spring JDBCiBatis 进行持久化数据时使用

org.springframework.orm.hibernate3.HibernateTransactionManager

使用Hibernate3.0版本进行持久化数据时使用

org.springframework.orm.jpa.JpaTransactionManager

使用JPA进行持久化时使用

org.springframework.jdo.JdoTransactionManager

当持久化机制是Jdo时使用

org.springframework.transaction.jta.JtaTransactionManager

使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用



2.TransactionDefinition  事务定义信息(隔离、传播、超时、只读)


 
  • 事务
  1. 事务:是逻辑上一组操作,要么全都成功,要么全都失败.
  • 事务特性(ACID)
  1. 原子性(Atomicity):事务不可分割
  2. 一致性(Consistency):事务执行的前后,数据完整性保持一致.
  3. 隔离性(Isolation):一个事务执行的时候,不应该受到其他事务的打扰
  4. 持久性(Durability):一旦结束,数据就永久的保存到数据库.
  • 如果不考虑隔离性
  1. 脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。
  2. 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致
    1. 在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。
    2. 相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。
  1. 虚读(幻读): 一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致
    1. 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。


  • 事务的隔离级别

隔离级别

含义

DEFAULT

(默认)

使用后端数据库默认的隔离级别(spring中的的选择项)

READ_UNCOMMITED

(未提交读)

允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读

READ_COMMITTED

(已提交读)

允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生

REPEATABLE_READ

(可重复读)

对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。

SERIALIZABLE

(串行的)

完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

  1. MySQL默认采用REPEATABLE_READ隔离级别;Oracle默认采用READ_COMMITTED隔离级别

  • 事务的传播行为
  1. 传播行为:解决业务层之间的调用的事务的关系.
  2. PROPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个
  3. * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)
  4. PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
  5. * A,B 如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.
  6. PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
  7. * A,B 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.
  8. PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
  9. * A,B 如果A有事务,BA的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)
  10. PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果有事务存在,挂起当前事务
  11. * A,B 非事务的方式运行,A有事务,就会挂起当前的事务.
  12. PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  13. PROPAGATION_NESTED如果当前事务存在,则嵌套事务执行
  1. * 基于SavePoint技术.
  2. * A,B A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,用户需要自己设置事务提交还是回滚.


3.TransactionStatus 事务具体运行状态

 
  1. 是否有保存点
  2. 是否一个新的事务
  3. 事务是否已经提交
  4. ...

原创粉丝点击