SQL-事务的特性与隔离级别

1.数据库中的事务有四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。

  • 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。例如两个人的钱加起来一共100元,无论这两个人之间怎么转账,二人的钱之和永远是100元。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读已提交、可重复读和序列化
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

2.事务的隔离

  • 读未提交:读取到未提交的数据。例如A的分数是100分,有一个事务X想要把小明的分数改成90分,写好了还没提交,但此时另一个事务Y读取小明的分数,却读取到了90分这个未提交的数据。但根据事务的原子性,只要事务X不提交,则操作会回滚,下一次读取小明的分数依旧是100。(所以事务Y读取到的90分这个数据就是垃圾数据,垃圾、呸、脏。)这就是脏读,针对的是未提交的数据。
  • 读已提交:读取已经提交的数据。例如事务Y有多个读取操作,第一次读取小明的分数是100分,此时事务X 把小明的分数改成90分并且提交,然后事务Y又读取了小明的分数,此时读到的数据就是90分。这就是不可重复读,针对的是已提交的数据项。
  • 可重复读:一个事务读取某个数据项前前后后都是一样的,但仅是数据项,而不是全部数据。例如原本数据中只有小明的分数,事务Y有多个操作,第一次读取所有的数据发现只有小明100分,此时事务X插入一条数据,小红90分,事务Y再一次读取所有的数据发现有2条。(卧槽!出现幻觉了吗?)这就是幻读(虚读),针对的是已提交的一批数据,而不是已提交的数据项。MySQL的默认隔离级别。
  • 序列化:最高隔离级别,加锁,不允许多个事务对同一张表进行修改操作。不会产生任何读取问题。

隔离级别逐渐增强,产生的读取问题越来越少。

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/12788722.html
今日推荐