Spring事务管理

Spring事务

  • Spring的事务本质是对数据库的支持,Spring事务依赖于数据库的事务。

事务:

  • 事务是并发控制的基本单位。所谓事务,在操作序列中,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务的原则:

  • 原子性(ATOMICITY): 
  • 一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。 

 

  • 一致性(CONSISTENCY): 
  • 一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下,一个一致的事务将保护定义在数据上的所有完整性约束。 

 

  • 隔离性(ISOLATION): 
  • 在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事: 
  • 在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。 
  • 两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。 

 

  • 持久性(DURABILITY): 
  • 一个被完成的事务的效果应该是持久的。 

工作流程:

  • 在类和方法上加@Transactional注解
  • Spring在启动时会解析生成bean,为方法和类生成动态代理,本根据@Transactional的配置进行注入。

事务传播:

多个事务同时存在时,spring应该如何处理这些事务的行为。

  • PROPAGATION_REQUIRED  支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
  • PROPAGATION_REQUIRES_NEW  新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作
  • PROPAGATION_SUPPORTS  支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY  支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_NOT_SUPPORTED  以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER  以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED   如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

Mysql隔离级别

  • Read-Uncommitted  导致脏读
  • Read-Committed  避免脏读,允许不可重复读和幻读
  • Repeatable-Read  避免脏读,不可重复读,允许幻读
  • Serializable  串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重

隔离级别

  • ISOLATION_DEFAULT  这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应。
  • ISOLATION_READ_UNCOMMITTED  这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  • ISOLATION_READ_COMMITTED  保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
  • ISOLATION_REPEATABLE_READ  这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
  • ISOLATION_SERIALIZABLE  这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

实现

  • 基于Spring Aop动态代理实现

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值