数据库事务的隔离级别

一.什么是事务:

1.事务:

把多个命令/事件打包到一起变成一个整体执行. 要么都执行,要么都不执行.
实现上述机制的核心就是"回滚",MySQL会记录之前执行的过程.

2.事务的四大基本特性:

<1>.原子性:
参照事务的概念
<2>.一致性:
事务内的事件逻辑执行结果都是一致的. 比如A给B转账50, A少50, B增加50.
<3>.持久性:
事务的执行过程都是会写入硬盘的,即使掉电/重启,事务都能正常工作,保证修改会生效
<4>.隔离性:
隔离性描述的是一个数据库服务器同时执行多个事务时,事务之间的 “相互影响程度” . 和多线程操作一样,事务的执行是并发的.


二.事务的四个隔离级别

由事务的并发执行引发的"安全问题", 对此设立不同的隔离级别
<1>. Read Uncommitted 读未提交
隔离性最低, 并发程度最高, 会产生 脏读+不可重复读+幻读 问题
<2>. Read Committed 读已提交
对写操作加锁, 降低了并发程度, 解决了 脏读 问题, 还会产生 不可重复读+幻读 问题
<3>. Repeatable Read 可重复读
对读和写操作都加锁, 进一步降低并发程度, 解决了 脏读+不可重复读 问题, 还会产生 幻读 问题
<4>. Serializable 序列化
事物的执行实行严格的串行化操作, 并发程度最低, 解决了 脏读+不可重复读+幻读 问题. 但舍弃了并发执行同样执行速度也是最慢的.


三.脏读+不可重复读+幻读 问题

用事务A和事务B举例说明

<1>脏读:

原因:
事务A进行写数据, 事务B进行读数据, 当事务A和事务B是并发执行, 如果事务B在事务A执行中进行数据读取, 因为事务A还没结束,B读到的这个数据不一定是A的最终结果, B读到的称为脏数据.
解决方法:
给事务A写操作加锁,等A执行完了B再进行读操作.

<2>不可重复读:

原因:
在上述场景基础, 如果事务A写操作完成,事务B进行数据读取, 当A此时对数据进行修改, 对B来说在同一事务中连续两次读操作结果不同,不合理
解决方法:
给事务B的读操作也加锁, 等B读完了再让A对数据修改等操作.

<3>幻读:

原因:
上述虽然对读写操作都加了锁,但只是针对同一个文件来说的. 比如B在读取一份文件时, A虽然不能此时对此文件修改操作, 但A可以 删除/新增 一个其他文件. 对B来说在同一个事务中,两次读到的结果集不同(看到文件列表的文件数量变了),不合理
解决方法:
彻底舍弃并发执行,改为串行执行


总结:

  • 事务就是把多个命令/事件打包到一起变成一个整体执行, 实现上述机制主要依靠"回滚".
  • 事务的四大基本特性:原子性,一致性,持久性,隔离性.
  • 事物的四个隔离级别(并发执行事务时产生的问题和应对手段): 脏读(给写操作加锁),不可重复读(给读操作加锁),幻读(串行化).
    事务的并发执行会带来安全问题,在实际场景中根据实际需求具体分析用哪种隔离级别.在执行效率和数据准确性之间取舍.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值