Spring 中事务属性详解

本文详细介绍了Spring中事务管理的属性,包括事务的传播属性如propagation,隔离级别如isolation(默认、读未提交、读已提交、可重复读、序列化),以及读写属性readonly、回滚规则、超时设置和InitializingBean接口的作用。这些属性提供了对事务的精细化控制,以适应不同的业务场景需求。

Spring 中事务属性详解

  • Isolation 指定事务的隔离级别

    • 读已提交 READ_COMMITTED
    • 读未提交 READ_UNCOMMITTED
    • 可重复读 REPEATABLE_READ
    • 串行化 SERIALIZABLE
    • 默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交)
  • timeout 设置单位为秒的超时。 默认值是 -1 表示使用数据库的设置。

  • readOnly 设置是否是只读事务。

    • 当你能确保整个事务过程中只对数据库执行Select操作的时候,如果将此属性设置为true,则会自动进行优化,提高性能。
  • Propagation 事务的传播属性(特有的精细化的控制),解决的是事务嵌套的问题

    • SUPPORTS(1),  //支持
      	Support a current transaction, execute non-transactionally if none exists.
      	支持当前事务,如果当前没事务,则在非事务的环境下执行。
      MANDATORY(2), //强制要求
      	Support a current transaction, throw an exception if none exists.
      	支持当前事务,如果当前没事务则抛出异常。
      NOT_SUPPORTED(4), //不支持
      	Execute non-transactionally, suspend the current transaction if one exists.
      	在非事务的环境下执行,如果当前存在事务,则挂起当前事务。
      NEVER(5), //从不使用
      	Execute non-transactionally, throw an exception if a transaction exists.
      	在非事务的环境下执行,如果当前存在事务,则抛出异常。
      	
      REQUIRES_NEW(3), //要求新的
      	Create a new transaction, and suspend the current transaction if one exists.
      	总是创建一个新的事务,如果当前有事务则挂起当前事务。
      REQUIRED(0),  //要求
      	Support a current transaction, create a new one if none exists.
      	如果当前有事务则使用当前事务,否则创建新的事务。
      NESTED(6); //嵌套
      	Execute within a nested transaction if a current transaction exists, behave like REQUIRED otherwise.
      	如果当前有事务,则在当前事务的嵌套事务中执行。否则,创建新的事务执行。
      	嵌套事务的特点:
      		内层事务的回滚,不会影响外层事务。
      		但是,外层事务的回滚,会影响内层事务。
      

1.事务传播属性

propagation: 传播

REQUIRED:   需要事务,外部存在事务融入当前事务,外部没有事务,开启新的事务
SUPPORTS:   支持事务,外部存在事务融入当前事务,外部没有事务,不开启新的事务
REQUIRES_NEW: 每次开启新的事务,如果外部存在事务外部事务挂起,开启新的事务运行,运行结束后回复外部事务
NOT_SUPPORTED: 不支持事务,如果外部存在事务外部事务挂起,已非事务方式运行.
NEVER:         不支持事务,存在事务报错
MANDATORY:     强制事务没有事务报错
NESTED:        嵌套事务,数据库不支持

2.事务的隔离级别

isolation 隔离级别

DEFAULT: 采用数据库默认隔离级别
READ_UNCOMMITTED: 读未提交
READ_COMMITTED: 读提交 用来避免脏读现象出现的 oracle默认隔离级别
REPEATABLE_READ: 可重复读主要是用来避免不可重复读现象出现的 (在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读) mysql默认隔离级别
SERIALIZABLE : 序列化读 用来避免幻影读现象出现 (在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读)

3.读写和异常性

readonly

true: 本次事务只读false: 本次事务非只读
<tx:method name=“save*” propagation=“REQUIRES_NEW” read-only=“true|false” isolation=“SERIALIZABLE”/>

rollback-for && no-rollback-for=""

rollback-for: 遇到什么类异常回滚
no-rollback-for: 遇到什么类异常不回滚
<tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>

timeout 超时性

timeout: -1 永不超时

InitializingBean接口

Spring内部的接口。

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

当一个注册到Spring容器中的Bean,实现了此接口以后。那么,Spring 容器创建完该对象,并设置好相关属性(DI)以后,会自动调用其 afterPropertiesSet 方法(相当于一个出厂时的质检环节,在这个方法里面可以写一些检查逻辑。比如:检查某些关键依赖是否已经被注入)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值