事务特性ACID及隔离级别的个人理解

事务特性 ACID

  • 原子性 (atomicity)
    原子(atom)指化学反应不可再分的基本微粒,原子在化学反应中不可分割。
    这里形容事务是一个整体不可再分,整体要么都成功要么都失败。
  • 一致性 (consistency)
    事务执行前后,数据应保持一致。
    可以借助转账场景理解:转账前后,双方总钱数不会发生改变。
  • 隔离性 (isolation)
    执行过程中的事务之间互不可见,互不影响。
    不同标准的隔离级别详见下方隔离级别
  • 持久性 (durability)
    事务成功提交后造成的影响是永久的,不可回滚。

隔离级别

隔离级别是不同事务执行过程中,相互之间的可见性
目前有四个隔离级别标准,分别是:

  • 读未提交 (Read Uncommited)
    最低隔离级别,未提交的事务所作修改能被其他执行中的事务可见,破坏了隔离性。此级别会造成脏读

    脏读:脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。

    一种更易理解的说法是:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

  • 读已提交 (Read Commited)
    是Oracle的默认隔离级别,已提交的事务所作修改能被其他执行中的事务可见,破坏了一致性。此级别会造成不可重复读

    不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

    一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

  • 可重复读 (Repeatable Read)
    MySQL的默认隔离级别,事务执行过程中,查询到的数据保证一致,即已提交的事务所作修改不能被其他执行中的事务可见。但对于insert的数据无效,因此会造成幻读 ,事务提交前后多了数据,就像出现了“幻觉”

    幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。

  • 串行化 (serializable)
    最高级别,事务之间完全串行化执行(慢慢排队执行吧~),毫无并发可言,因此性能较低!但可避免幻读现象

下方贴图一张,较为形象的表达了不同隔离级别解决的问题:

image.png
image.png

本文供个人理解使用,如有失误欢迎指出~!感谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。