博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务隔离级别下本质
阅读量:6626 次
发布时间:2019-06-25

本文共 1533 字,大约阅读时间需要 5 分钟。

事务隔离级别本质

在数据库管理系统中,事务保证了一个操作序列可以全部执行或全部不执行(原子性),从一个状态转变到另外一个状态(一致性)。由于事务满足持久性,所以一旦事务被提交之后,数据就能够被持久化下来,又因为事务是满足隔离性的,所以,当多个事务同时处理同一个数据的时候,多个事务之间是互不影响的,所以在多个事务并发操作的过程中,如果控制不好隔离级别,就有可能产生脏读,不可重复读或者幻读等读现象。

读未提交

  • 隔离级别最低,一个事务可以读到另一个事务未提交的数据
内部锁情况
  • 事务在读数据时候未对数据加锁
  • 事务在修改数据的时候只对数据增加行级共享锁
现象
  • 事务1读取某行记录,事务2也可以对这行记录进行读取,更新(因为事务1并未对数据增加任何锁)
  • 事务2对该行记录进行更新时,事务1在此读取该记录,能够读到事务2对该记录的修改版本(因为事务2只增加了共享读锁,事务1可以再增加共享读锁读取数据)
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束(因为事务1对数据增加了共享读锁,事务2不能增加排他锁进行数据的修改)

读提交

  • 一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据
内部锁情况
  • 事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁
  • 事务在更新某数据的瞬间,必须对其加行级排他锁,直到事务结束才释放
现象
  • 事务1在读取某行记录的整个过程,事务2都可以对该行进行读取(因为事务一对该行记录增加行级共享锁的情况下,事务2同样可以对该数据增加共享锁来读数据)
  • 事务1读取某行的瞬间,事务2不能修改该行,但是,事务1读取完该行数据,事务2便可以对该行数据进行修改(因为事务一在读取一瞬间会对数据增加共享锁,任何事务都不能加排他锁,但是事务一旦读完就会释放行级共享锁)
  • 事务1更新某行记录,事务2不能对这行数据做更新,因为更新的时候会加上排他锁,直到事务结束才会释放锁。所以在事务1没有提交之前,事务2都不能对数据增加共享锁进行数据的读取。所以读提交能够解决脏读问题

可重复读

内部锁情况
  • 事务在读取某数据的瞬间,必须先对其加行级共享锁,直到事务结束才释放
  • 事务在更新某数据的时候,必须先对其加行级排他锁,直到事务结束才释放
现象
  • 事务1在读取某行记录的整个过程,事务2都可以对该行记录进行读取(因为事务1对该行记录增加行级共享锁的情况下,事务2同样可以对该行数据增加共享锁来读数据)
  • 事务1在读取某行记录,事务2不能修改该行数据(因为事务1读取数据会对数据增加共享锁,直到事务提交才会释放,所以整个过程不允许其他事务对该行数据增加排他锁,解决了不可重复读的情况)
  • 事务1更新某行记录时,事务2不能对这行数据做更新,直到事务1结束(因为更新的时候会增加排他锁,直到事务结束才会释放)
  • 会出现幻读情况,mysql已使用MVCC解决了该问题

可序列化

  • 可序列化是最高隔离级别,能够解决脏读,不可重复读,幻读问题
内部锁情况
  • 事务在读取数据时,必须先对其加表级共享锁,直到事务结束才释放
  • 事务在更新数据时,必须先对其加表级排他锁,直到事务结束才释放
现象
  • 事务1正在读取A表中的记录时,则事务2也能够读取A表,但不能对A表作更新,增加,删除,直到事务1结束(因为事务1的关系对表增加了表级共享锁,其他事务只能增加共享锁读取数据,不能进行其他操作)
  • 事务1正在更新A表中的记录,则事务2不能读取A表的任何记录,更不能对A增删改,直到事务1结束(事务1对表增加了表级排他锁,其他事务不能对表增加任何锁)

转载于:https://www.cnblogs.com/develop-SZT/p/10391718.html

你可能感兴趣的文章
C++ Virtual 关键字
查看>>
兩個集合之間的全體部分函數可以形成一個集合
查看>>
subline 快捷键与功能解释
查看>>
关于informatica的Dynamic Lookup组件使用中遇到的一个问题的思考
查看>>
[转]模拟频率与数字频率
查看>>
转 Spring Security 简介
查看>>
DP ZOJ 3735 Josephina and RPG
查看>>
数位DP GYM 100827 E Hill Number
查看>>
有关SQLite的substr函数的笔记
查看>>
Kafka 配置参数汇总及相关说明
查看>>
Joel在耶鲁大学的演讲
查看>>
【C语言】类型限定词
查看>>
TypeScript 素描-变量声明
查看>>
AMF序列化为对象和AMF序列化为二进制字节流
查看>>
Python3 学习
查看>>
python之路day12--装饰器的进阶
查看>>
[LeetCode] Two Sum III - Data Structure Design
查看>>
课后作业-阅读任务-阅读笔记-4
查看>>
【转】ARC下dealloc过程及.cxx_destruct的探究
查看>>
NGUI的窗体的推动和调节大小(drag object和drag resize object)
查看>>