spring事务传播特性和隔离机制

Spring事务传播行为

传播行为如下(七种形式)

名称含义简介
PROPAGATION_REQUIRED表示当前方法必须在一个事务中运行。如果存在事务正在进行中,该方法将会在这个事务中运行,否则就会开始一个新的事务进行这个方法有事务就用这个事务,没有就新建事务
PROPAGTION_SUPPORTS表示当前方法不需要事务性上下文,但是如果有一个事务正在运行,这个方法会在这个事务中运行,没有就以非事务的方式进行有事务就用这个事务,没有就不用事务
PROPAGTION_MANDATORY表示当前方法必须运行在一个事务中,如果当前方法没有在事务中,将抛出一个异常方法必须运行在一个存在的事务中,否则抛出异常
PROPAGATION_REQUIRES_NEW表示当前方法必须在他自己开启的事务里运行。会启动一个新的事务,如果存在一个现有的事务,则将会在这个方法运行期间挂起。开启新的事务运行方法,旧事务存在的话就挂起
PROPAGATION_NOT_SUPPORTED表示该方法不应该在一个事务中运行,如果存在一个现有事务正在进行中,它将在该方法的运行期间被挂起不使用事务,并挂起已存在的事务
PROPAGATION_NEVER表示当前的方法不应该在一个事务中运行。如果当前有事务正在进行,则会抛出一个异常不使用事务,存在旧事务则抛出异常
PROPAGATION_NESTED表示如果当前存在一个在进行中的事务,则当前方法应当运行在一个嵌套的事务中。被嵌套的事务可以独立与封装事务进行提交或回滚,如果封装事务不存在,则按照PROPAGATION_REQUIRES进行以嵌套事务进行,如果外部的回滚,则内部也会回滚。外部的提交,内部的也会提交。但是内部事务不会影响外部事务

Spring在TransactionDefinition接口中定义了其中事务传播行为

Spring的注解@Transactional,默认式以PROPAGATION_REQUIRED的形式进行的

即有事务就用事务,没有事务就新建

 

 

Spring的隔离级别

名称解释

ISOLATION_DEFAULT

默认数据库级别

这是PlatfromTransactionManager中默认的隔离级别,使用数据库默认的事务隔离级别。其他四个与JDBC的隔离级别相对应

ISOLATION_READ_UNCOMMITTED

读未提交

事务最低的隔离级别。允许另外一个事务可以看到这个事务未提交的数据。会产生脏读,不可重复读,幻读

ISOLATION_READ_COMMITTED

不可重复读

保证一个事务修改的数据提交后才会被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

ISOLATION_REPEATABLE_READ

可重复读

可重复读,保证多次读取同一个数据时,数据和事务开始时的内容是一致的,禁止读取到别的事务未提交的数据。可以防止脏读,不可重复读(重点在修改),但是会出现幻读(重点在增加与删除)。

虽然这种级别无法解决幻读,但是MySQL用一种Next key-lock的算法来实现可重复读并解决幻读。在进行查询时不仅会将当前的操作记录所著,也会将查询范围所著。也就是说,其他事务如果想要在当前事务查询的范围内进行数据操作,是会被阻塞等待获取锁的。

因此MySQL在可重复读的级别下实现了serializable的隔离级别

MySQL的默认级别,可以在数据库中修改

ISOLATION_SERIALIZABLE

串行化

串行化,不可重复读,最大的亮点是可靠且代价高

所有事务执行(包括查询操作)都会为所处理的数据加锁,操作同一数据的事务都需要等待

可以防止脏读,不可重复读,幻读

  1. 丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,由于没有加锁造成
  2. 脏读:一个事务读取到另一个事务未提交的事务
  3. 幻读:同样的事务操作过程中,不同时间段不同事务读取同一数据,内容不一致。重点在于插入与删除,第二次查询后行数变多或变少了。
    只需要用表锁就能解决
  4. 不可重复读:同一个事务中,多次读取内容不一致。重点在于修改,第二次查询发现内容是修改后的内容。
    只需要用行锁就能解决

 

Spring中的事务分类

  1. 声明式:通过XML配置或者注解实现(业务逻辑中只管操作数据库,不需要管事务就能自动使用事务)
  2. 编程式:通过编程代码在业务逻辑时需要自行实现事务

 

数据库事务

四大特性 ACID

  1. 原子性(Atomicity):在一个事务中的操作都是一个逻辑(不可分割)的单元,在执行事务序列时,这些操作要么全部成功,要么全部失败
  2. 一致性(Consistency):事务执行前和执行后,数据的完整性须处于一致的状态
  3. 隔离性(Isolation):并发事务执行之间是相互隔离的,互不影响
  4. 持久性(Durability):一旦事务成功提交,对数据库的改变必须是永久的


纯JDBC使用事务如下步骤

  1. 获取数据库连接Connection c=DriverManager.getConnection()
  2. 开启事务c.setAutoCommot(true);//自动提交
  3. 执行CRUD
  4. 提交/回滚事务c.commit()/c.rollback()
  5. 关闭连接c.close()

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
事务隔离级别是指多个事务并发执行时,一个事务对其他事务的可见性和影响程度的控制。Spring框架支持四个事务隔离级别: 1. 未提交读(READ UNCOMMITTED):最低级别,一个事务可以读取未提交的数据,会导致脏读,不可重复读和幻读问题的出现。 2. 提交读(READ COMMITTED):一个事务只能读取已提交的数据,可以避免脏读问题,但可能导致不可重复读和幻读问题。 3. 可重复读(REPEATABLE READ):在一个事务中多次读取同一数据时,结果保持一致,避免了不可重复读问题。但仍然可能存在幻读问题。 4. 串行化(SERIALIZABLE):最高级别,通过确保事务串行执行来避免脏读、不可重复读和幻读问题。但会降低并发性能。 传播机制是指在调用多个事务方法时,如何处理事务传播Spring框架提供七种传播行为: 1. REQUIRED:如果当前没有事务,就创建一个新事务;如果已存在事务,则加入该事务。 2. SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方法执行。 3. MANDATORY:强制要求存在当前事务,如果没有事务就抛出异常。 4. REQUIRES_NEW:创建一个新事务,并暂停当前事务(如果有)。 5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。 6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。 7. NESTED:在当前事务的控制下执行一个嵌套事务,如果不存在当前事务,则创建一个新事务。嵌套事务可以独立提交或回滚,但在外部事务提交时才会生效。 通过选择合适的事务隔离级别和传播机制,可以确保事务的数据一致性、安全性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值