# 数据库事务

数据库事务有四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

# 什么是事务

1. 事务首先要保证一组数据库操作要么全部成功要么全部失败

2. 在 Mysql 当中,事务的实现是在引擎层

# 事务特性 --- 隔离性

隔离性:当多个用户并发操作数据库时候,数据库为每一个用户开启不同的事务,这些事务之间互不干扰,相互隔离

事务的隔离级别:

  • 读未提交:一个事务还没有做提交时候,它做的变更就能被其他事务所看见
  • 读提交:一个事务提交之后,它做的变更才会被其他事务所看见
  • 可重复读:一个事务在执行过程中获得数据总是跟这个事务启动的时候获得数据的一致的;在这种隔离级别下,未提交的数据其他事务是获取不到的
  • 串行化:在这种事务级别下,写会加写锁,读会加读锁,当发生读写冲突的时候,后执行的事务需要等前面的事务执行结束才能继续

数据库实现上面,数据库会创建一个视图

1. 如果是读未提交,那么它会直接返回记录上的值,不需要视图

2. 如果是读提交,那么视图将在每个 SQL 语句开始执行的时候创建

3. 如果是可重复读,那么视图将在事务启动的时候创建,整个事务存在期间都用这个视图当中的数据

4. 如果是串行化,那么直接使用读写锁来避免

如果不相互隔离的话,将会出现以下问题:

# 1. 脏读

一个事务读取了另一个事务未提交的数据,这种数据称之为脏数据

  • 事务 A 更新了一个 x 值;
  • 事务 B 查询了 x 值;
  • 事务 A 提交失败回滚
  • 事务 B 再次查询 x 值,两者前后不一致
# 2. 脏写

一个事务更新了另一个事务未提交的数据,这种数据称之为脏数据

  • 事务 A 和事务 B 同时对 x 值进行更新
  • 事务 A 先把 x 更新
  • 事务 B 后把 x 更新
  • 事务 A 提交时候检查失败,进行回滚操作,把 x 回滚为 null
  • 事务 B 提交检查时候发现 x 值还是 null
# 3. 不可重复读

在一个事务范围内多次查询某一个数据却得到不同的结果

由于可能存在第二个事务对该数据进行修改,所以会导致两次查询得到不同的结果

  • 事务 A 查询 x 为 100
  • 事务 B 修改 x 为 200
  • 事务 B 提交事务
  • 事务 A 查询 x 为 200
# 4. 幻读

一个事务查询多条记录时候,多次查询得到的记录数量不一致

  • 事务 A 查询 x>3 的所有记录,共 5 条
  • 事务 B 插入插入两条 > 3 的记录
  • 事务 B 提交事务
  • 事务 A 查询 x>3 的所有记录,共 7 条

异同:

幻读和不可重复读都是读取了另一个事务已经提交了的事务数据,脏读是读取了未提交的数据

幻读和不可重复读区别为,幻读是针对一批数据,而不可重复读是针对同一个数据

脏读不可重复读幻读
读未提交会出现会出现会出现
读提交不会出现会出现会出现
可重复读不会出现不会出现会出现
串行化不会出现不会出现不会出现

开启事务的方法:

使用命令 start transaction 或者 begin 开启新的事务;

使用 commit 提交事务

使用 rollback 回滚当前事务

image-20220901115253626

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Charmber 微信支付

微信支付

Charmber 支付宝

支付宝

Charmber 贝宝

贝宝