Spring事务相关内容

事务的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 属性
   抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值