Spring事务梳理

一、事务概念


事务是恢复和并发控制的基本单位。

在企业级软件开发中,事务管理是必不可少的的一项技术,以保证数据的完整性和一致性。


事务具有如下特性:(ACID)

A :Atomic 原子性。要么全部完成,要么全部失败。

C :Consistency 一致性。业务上下流一致,不会存在上流成功,下流失败。

I :Isolation 隔离性。不同事务间相互隔离。

D :Durability 持久性。事务一旦完成,结果便是固定了,无论系统发生任何错误。


二、Spring事务

2.1 Spring事务管理器

Spring事务管理是由实现接口org.springframework.transaction.PlatformTransactionManager的类进行事务管理的。

Spring为各个平台提供了对应的事务管理器,如:DataSourceTransactionManager(JDBC事务管理)JpaTransactionManager(JPA事务管理器)HibernateTransactionManager等等。


public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;

    void commit(TransactionStatus var1) throws TransactionException;

    void rollback(TransactionStatus var1) throws TransactionException;
}
2.1.1 事务属性定义TransactionDefinition

PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务,入参为TransactionDefinition,该类具体代码如下:

public interface TransactionDefinition {
    //事务传播行为
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    //事务隔离级别
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;
    //获取事务传播行为
    int getPropagationBehavior();
    //获取事务隔离级别
    int getIsolationLevel();
    //事务超时时间
    int getTimeout();
    //是否只读
    boolean isReadOnly();
    //获取事务名称
    String getName();
}


2.1.2 事务传播行为PropagationBehavior

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

Spring定义七种事务传播行为:

传播行为含义
REQUIRED(需要)(Default)如果当前存在事务,则在当前事务运行,否则创建一个新的事务。
REQUIRES_NEW(需要新的)创建新的事务,如果当前存在事务,挂起当前存在的事务。
SUPPORTS(支持)支持当前事务,如果当前事务不存在,则以非事务方式执行。
NOT_SUPPORTED(不支持)以非事务方式执行,如果当前事务存在,则挂起当前事务。
MANDATORY(强制)支持当前事务,如果当前事务不存在,则抛出异常。
NEVER(从不)以非事务方式执行,如果当前事务存在,则抛出异常。
NESTED(嵌套)如果当前事务存在,则在嵌套事务中执行,否则与REQUIRED一致。

2.1.3 事务隔离级别

事务隔离级别是为了处理若干个并发的事务之间的隔离程度

Spring定义五种事务隔离级别:

隔离级别含义
DEFAULT(Default)使用底层数据库的默认隔离级别。
READ_UNCOMMITTED读未提交。可能发生脏读、不可重复读、幻读。
READ_COMMITTED读已提交。可能发生不可重复度、幻读。
REPEATABLE_READ可重复读。可能发生幻读。
SERIALIZABLE可串行化读。不会发生以上的问题,但性能降低。


  • 脏读:读取到另一个事务回滚前的脏数据。
  • 不可重复读:发生在一个事务的查询中,读取到另一个事务的更新数据。
  • 幻读:幻读是不可重复读的一种特殊情况,侧重于增删的情况下。当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻影读就发生了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值