欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring事务相关内容

程序员文章站 2022-04-25 19:33:47
...

事务的4个特性(ACID):

1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部
执行,要么全部不执行。

2)一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须
应用于事务的修改,以保持所有数据的完整性。(实例:转账,两个账户余额相加,值不变。)

3) 隔离性(isolation):一个事务的执行不能被其他事务所影响。

4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即便是在数据库系统遇到故障
的情况下也不会丢失提交事务的操作。

五个隔离级别:

ISOLATION_DEFAULT	使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED	允许读取尚未提交的更改。可能导致脏读、幻读或不可重复读。
ISOLATION_READ_COMMITTED (Oracle 默认级别)允许从已经提交的并发事务读取。可防止脏读,但幻读
和不可重复读仍可能会发生。
ISOLATION_REPEATABLE_READ(MYSQL默认级别)对相同字段的多次读取的结果是一致的,除非数据被当前事
务本身改变。可防止脏读和不可重复读,但幻读仍可能发生。
ISOLATION_SERIALIZABLE	完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级
别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。

7种传播行为:

PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
(常用的就第一种REQUIRED和第四种REQUIRES_NEW)

####项目中事务使用#####
开启事务管理(隐式开启的好像,没有深究)
@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />

@Transactional
1、 注解只能应用到 public 方法才有效。

@Transactional(propagation = Propagation.REQUIRED)
@Override
public void test() {

    test1();

    User user = new User("服部半藏");
    userMapper.insertSelective(user);

    if (true) {
        throw new RuntimeException("save 抛异常了");
    }
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test1() {
    User user = new User("宫本武藏");
    userMapper.insertSelective(user);
}
运行之后发现数据都没没有插入数据库,
其实两个方法都是处于同一个事务中,test1方法并没有创建一个新的事务。

2、在默认的代理模式下,只有目标方法由外部调用,才能被 Spring 的事务拦截器拦截。在同一个类中的两个方法直接调用,是不会被 Spring 的事务拦截器拦截(即事务不生效)。

3、属性介绍

propagation 属性
   ######## 事务的传播行为,默认值为 Propagation.REQUIRED。
    可选的值有:
     Propagation.REQUIRED
       如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
     Propagation.SUPPORTS
        如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
     Propagation.MANDATORY
        如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
     Propagation.REQUIRES_NEW
        重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
     Propagation.NOT_SUPPORTED
        以非事务的方式运行,如果当前存在事务,暂停当前的事务。
     Propagation.NEVER
        以非事务的方式运行,如果当前存在事务,则抛出异常。
    Propagation.NESTED
        如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似
        的操作
isolation 属性
   #######事务的隔离级别,默认值为 Isolation.DEFAULT。
         可选的值有:
          Isolation.DEFAULT 使用底层数据库默认的隔离级别。
          Isolation.READ_UNCOMMITTED
          Isolation.READ_COMMITTED
		 Isolation.REPEATABLE_READ
		 Isolation.SERIALIZABLE
timeout 属性
  事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
 
readOnly 属性
  指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,
  可以设置 read-only 为 true。
rollbackFor 属性
  用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。如果不配置rollbackFor属性,那么事物只会在
  遇到RuntimeException或错误才会回滚,加上rollbackFor=Exception.class,遇到非运行时异常时也回滚
 noRollbackFor 属性
   抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。