Spring-tx事务管理

Spring-tx事务管理

1.事务的概念:

​ 事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起 向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。

2.事务的分类1
  • 编程式事务

编程式事务是指手动编写程序来管理事务,即通过编写代码的方式直接控制事务的提交和回滚。在 Java 中,通常使用事务管理器(如 Spring 中的 PlatformTransactionManager)来实现编程式事务。

编程式事务的主要优点是灵活性高,可以按照自己的需求来控制事务的粒度、模式等等。但是,编写大量的事务控制代码容易出现问题,对代码的可读性和可维护性有一定影响

  • 声明式事务

声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。

开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!

使用声明式事务可以将事务的控制和业务逻辑分离开来,提高代码的可读性和可维护性。

3.事务具有4个基本特性:
  • 原子性:一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性:持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
4.事务隔离级别
(1)为什么要事务隔离2
  • 更新丢失

    两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发并没有被隔离开来。

  • 脏读

    对于两个事务T1,T2,T1读取了已经被T2更新但还没有提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。

  • 不可重复读

    对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不一样了。

  • 幻读

    对于两个事务T1,T2,T1从一个表中读取了字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。

(2)Spring事务隔离级别

隔离级别由低到高: 读未提交=>读已提交=>可重复读=>序列化操作

隔离级别说明脏读不可重复读幻读
ISOLATION_DEFAULTspring默认数据库的隔离级别
ISOLATION_READ_UNCOMMITTED读未提交
ISOLATION_READ_COMMITTED读已提交×
ISOLATION_REPEATABLE_READ可重复读××
ISOLATION_SERIALIZABLE序列化操作×××
5.事务传播行为
传播行为说明
REQUIRED【默认】当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改)
SUPPORTS当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询)
MANDATORY当前如果有事务,Spring就会使用该事务;否则会抛出异常
REQUIRES_NEW当前如果有事务,把当前事务挂起,新建事务
NOT_SUPPORTED当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起
NEVER当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
NESTED当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样
6.事务的应用
     添加事务
      @Transactional()
       位置:方法/类
       	方法:当前方法有事务
      	类上:类下所有方法都有事务
       
     1.只读模式readOnly
       只读模式可以提升查询事务的效率! 推荐事务中只有查询代码,使用只读模式
       默认: boolean readOnly() default false
       解释:一般情况下,都是通过类添加注释添加事务!
           类下的所有方法都有事务
           查询方法可以通过再次添加注释,设置只读模式,提升效率!
     2.超出时间timeout
       默认:永远不超时  -1
       设置 timeout = 时间 秒数  超出时间,就会回滚事务和释放异常
       在类上设置事务属性,方法也设置了事务注解! 方法会不会生效
       不会生效: 方法上的注解覆盖了类上的注解
    
     3.指定异常回滚和指定异常不会滚:rollbackFor/noRollbackFor
       默认情况下,指定发生运行是异常事务才会回滚
       我们可以指定Exception异常来控制所有异常来回滚!
           rollbackFor = Exception.class
       noRollbackFor = 回滚异常范围内,控制某个异常不会回滚
    
     4.隔离级别设置isolation
       推荐设置第二个隔离级别 读已提交 isolation = Isolation.READ_COMMITTED

  1. 事务的分类 ↩︎

  2. 为什么要事务隔离 ↩︎

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值