事务基本概念

一、事务定义
所谓事务,单个逻辑工作单元执行的一系列操作,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位
二、事务四个特性(ACID)

  1. 原子性(Atomicity)
    原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
    补充示例: 转账 A转给 B 1000元 只能出现两种结果
    1. 全部执行成功
    2. 全部执行失败
      任何一项操作失败都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成
  2. 一致性(Consistency)
      事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态
    补充示例: 假设用户A和用户B两者的钱加起来一共是5000,那么如果只有A和B之间转账,无论如何转账,转几次账,那么事务结束后两个用户的钱相加起来必须还是5000,这就是事务的一致性。
    备注说明: 一致性 和 原子性 比如A转给B 500 ,B账户增加100 如果整个操作成功,那么符合事务的原子性,不符合事务的一致性。 只有B同时增加500这时候才符合事务的一致性。一致性不等同原子性,可能还有其它操作.
  3. 隔离性(Isolation)
    事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。
    补充示例: 文档不能多人同时进行编辑
    备注: 隔离性分4哥级别
  4. 持久性(Durability)
    事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
    例如:MySQL对此的实现方法是 预写式日志(Write ahead logging),即修改数据库时,不直接修改数据库内容,而是将修改完的数据写入日志中,并同步到磁盘上,这样对其他读进程就没有影响。如果数据库崩溃,重启后扫描日志文件,然后更新的数据库中。

三、事务隔离级别
1.读未提及(READ_UNCOMMITTED)
如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
脏读定义: 在数据库访问中,假设有两个事务TA,TB.事务TB将某一值修改,然后事务TA读取该值,此后TB因为某种原因撤销对该值的修改,这就导致了TA所读取到的数据是无效的
2. 读已提交(READ_COMMITTED)
读已提交 是不同的时候执行的时候只能获取到已经提交的数据。
这样就不会出现上面的脏读的情况了。可是解决了脏读问题,但是引起了不可重复读问题
不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致
一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。
3. 可重复读(REPEATABLE_READ)
可重复读就是保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别进制了不可重复读取和脏读,但是有可能出现幻读的数据。
4. 顺序读(SERIALIZABLE)
顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。
在这里插入图片描述
备注: 4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。
一般数据默认级别是读以提交或可重复读。

四、Spring 事务隔离级别和传播行为
隔离级别和事务隔离级别一致
事务的传播行为

  1. 保证同一个事务中
    PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
    PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
    PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
  2. 保证没有在同一个事务中
    PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
    PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
    PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
    PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
    五、Spring使用
//遇见异常回滚操作
@Transactional(rollbackFor = Exception.class)
//默认情况遇到RuntimeException才会回滚
@Transactional
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值