spring事务、事务传播、事务隔离级别

参考

https://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
https://segmentfault.com/a/1190000013341344
https://baijiahao.baidu.com/s?id=1611918898724887602

事务ACID

原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability

开启事务 (MySql只有 InnoDB引擎 支持事务)

在接口或类的声明处 ,写一个@Transactional
要是只在接口上写, 接口的实现类就会继承下来。但是在接口的实现类的注解,可以覆盖类声明处的注解设置
@Transactional //类级的注解、适用于类中所有的public的方法

什么是事务传播行为

事务传播行为是指 作为事务的方法 被嵌套进 另一个方法(外围方法) 时的处理方法

spring事务传播行为注解

@Transactional(propagation=Propagation.REQUIRED)
如果 外围方法 是个事务, 那么 内部方法的事务 会加入 外围方法的事务, 没有的话新建一个事务(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个(外围)方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管 外围方法 是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

事务超时设置:

@Transactional(timeout=30) //默认是30秒

事务的隔离性

事务的隔离性指 多个并发的事务 同时 访问一个数据库时,一个事务 不应该被 另一个事务 所干扰,每个 并发的事务 间要相互进行隔离。

  • 脏读(dirty read)(读取未提交数据)
    A事务 读取 B事务 尚未提交的数据 ,此时 如果 B事务发生错误并执行回滚操作,那么 A事务 读取到的数据就是 脏数据

  • 不可重复读 (unrepeatable read)
    事务T1读取某一数据,事务T2 修改 了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

  • 幻读(phantom problem)
    事务T1读取某一数据,事务T2 增删 了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

数据库四种隔离级别

  • 读未提交(Read Uncommitted)
    顾名思义,就是可以读到未提交的内容。
    可能会产生“脏读”、“不可重复读”、“幻读”。
    如无特殊情况,基本是不会使用这种隔离级别的。

  • 读提交(Read Committed)
    顾名思义,就是只能读到已经提交了的内容。
    这是各种系统中最常用的一种隔离级别,也是SQL Server和Oracle的默认隔离级别。

  • 可重复读(Repeated Read)
    可以有效的避免“不可重复读”。而它也是MySql的默认隔离级别。

  • 串行化(Serializable)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值