spring事务原理解析

spring事务原理解析

1. 事务

事务是指要执行的一组操作,所要做的事情,可能是一组SQL语句,或者是一些列代码。

事务最典型的例子就是银行转账的问题,客户A给客户B转账100元,正常情况下,应该A账户扣去100元,B账户增加100元。但是因为某些原因,比如网络问题,导致A的余额减去后,B的余额没有成功增加100,如果没有事务保证,就会出现上述的问题,这是不合理的。所以需要事务来保证一系列操作的合理性。

其中事务有四个重要的概念,分别是原子性、一致性、隔离性和持久性。下面分别介绍四种特性:

  1. 原子性:原子性是指一组操作,要么全部执行,要不全部不执行。例如上述的转账例子,A账户扣钱和B账户加钱这两个操作,要么一起执行,要么都不执行。
  2. 一致性:是指事务完成后,无论失败或者成功,数据需要保持一致状态,不能部分数据被修改,而部分修改失败。如上述例子中的转账,不能A账户的数据修改成功,B账户的数据修改失败。
  3. 隔离性:隔离性是指多个用户并发访问数据的时候,每个用户开启一个事务,事务之间相互不影响。例如同时有两个账户给A转钱,不会因为两个操作同时进行而影响到彼此。
  4. 持久性:是指一旦事务结束,数据提交后,数据便被持久化到磁盘,即使发生故障也不会导致数据丢失。例如A给B转账成功后,即使银行的机器发生故障,也不影响A和B的账户余额。

2. spring的事务

2.1 相关接口和类说明

2.1.1 PlatformTransactionManager

其中spring最顶层的抽象接口是PlatformTransactionManager,该接口定义类各个平台事务管理器需要实现的方法,其中主要方法如下:

  1. TransactionStatus getTransaction(TransactionDefinition definition):该方法根据定义的事务传播行为,返回当前已激活的事务或者创建一个新的事务。如果是新创建的事务,其隔离级别和超时时间的设置在参数TransactionDefinition中定义,如果是加入已有的事务,则这些属性设置被忽略。其中TransactionDefinition定义了传播行为,隔离级别和超时时间等设置,如果传入null则使用默认设置,在类DefaultTransactionDefinition中定义。
  2. void commit(TransactionStatus status):该方法根据事务的状态,将给定的事务提交、回滚或者不做任何操作。如果该事务被标记为rollback-only,将事务的修改进行回滚。如果该事务不是新建的事务,作为一个已有事务的部分事务,则不提交该部分事务。如果先前的事务被挂起,并新建了一个事务,则提交本事务后,继续执行原来的事务。
  3. void rollback(TransactionStatus status):该方法将给定的事务回滚。如果该事务不是新建的事务,则将其所参与的事务设置为rollback-only。如果之前的事务被挂起重新创建了一个事务,则将本事务回滚并继续执行原来的事务。

2.1.2 TransactionDefinition

TransactionDefinition是一个接口,其中包含一些常量定义了事务的传播行为和隔离级别,以及一些抽象方法。常量和方法如下:

各个事务传播行为的意义如下:

  1. PROPAGATION_REQUIRED:如果当前存在事务,则加入当前事务,否则新建一个事务;
  2. PROPAGATION_SUPPORTS:如果当前存在事务,则以事务的方式运行,否则以非事务的方式运行;
  3. PROPAGATION_MANDATORY:支持当前事务,如果当前不存在事务,则抛出异常;
  4. PROPAGATION_REQUIRES_NEW:如果当前存在事务,则将当前事务挂起;否则直接新建一个事务。被挂起的事务在新建事
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值