Spring事务管理浅入

如下是官方英文文档:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/data->access.html#transaction-motivation

1.什么是事务

事务是数据库的概念,指一系列操作。这组操作要么全部成功,要么全部不成功。

1.1 事务的要素(ACID)

  • 原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。
  • 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  • 持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

1.2事务的属性

事务的属性.png
//版本为4.3.25

package org.springframework.transaction;

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();
}

1.3事务的传播行为

传播行为 含义
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务则加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 表示该方法在事务中运行,如果当前事务不存在,则会抛出异常
PROPAGATION_REQUIRED_NEW 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。
PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类型的操作

1.4并发事务导致的问题

我觉得恶霸 可能原因
脏读 发生在一个事务读取了另外一个事务改写尚未提交的数据时,改写的数据被回滚了,那么第一个事务获取的数据无效

1.5事务的隔离性

隔离级别 作用
Serializable 可避免脏读、不可重复读、虚读情况的发生
Repeatable 可避免脏读、不可重复读情况的发生
Read Committed 可避免脏读情况发生
Read Uncommitted 最低级别,以上情况均无法保证

2.事务的用处

事务保证了数据的一致性。 在处理业务中,存在进行对多个表操作,但如果某个表的数值存储失败,可以进行事务回滚。回滚至操作之前的数据。

3.spring的事务管理

参考资料:
Spring 事务 -- @Transactional的使用https://www.jianshu.com/p/befc2d73e487

你可能感兴趣的:(Spring事务管理浅入)