Spring事务管理

2020/10/21 20:09 下午 posted in  Spring Java

@Transactional 保证事务一致性。
当出现异常时,会回滚

隔离级别:
隔离级别是指多个并发事务之间的隔离程度。与开发相关的场景主要包括:脏读取、重复读、幻读。

package org.springframework.transaction.annotation;

public enum Isolation {
    DEFAULT(-1),
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);

    private final int value;

    private Isolation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

Isolation枚举类中定义了5个表示隔离级别的值

DEFAULT 默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,就是READ_COMMITED

READ_UNCOMMITED:该隔离级别表示,一个事务可以读取另一个事务修改但是还未提交的数据。不能防止脏读和不可重复读。很少使用。

READ_COMMITED:该隔离级别表示,只能读取另一个事务已经提交的数据。该事务级别可以防止脏读,也是大多数情况下的推荐值。

REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并返回相同结果。在多次查询之间有新增的值会被忽略。可以防止不可重复读和脏读。

SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别

指定方法:

@Transactional(isolation = Isolation.DEFAULT)

传播行为:

package org.springframework.transaction.annotation;

public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);

    private final int value;

    private Propagation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

Propagation枚举类中定义了6个表示传播行为的枚举值:
REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED