zoukankan      html  css  js  c++  java
  • 事务隔离级别下本质

    事务隔离级别本质

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

    读未提交

    • 隔离级别最低,一个事务可以读到另一个事务未提交的数据
    内部锁情况
    • 事务在读数据时候未对数据加锁
    • 事务在修改数据的时候只对数据增加行级共享锁
    现象
    • 事务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对表增加了表级排他锁,其他事务不能对表增加任何锁)
  • 相关阅读:
    Kubernetes 部署微服务电商平台(16)
    Android开发如何去除标题栏title
    eclipse中logcat偶尔不显示log的问题解决办法
    Two Sum
    事件的解除与绑定
    使用 Canvas 绘图
    表单脚本
    事件
    DOM2 和 DOM3
    DOM扩展
  • 原文地址:https://www.cnblogs.com/develop-SZT/p/10391718.html
Copyright © 2011-2022 走看看