数据库事务的四大特性和四个隔离级别

  • Post author:
  • Post category:其他




一、数据库事务的四大特性

事物是指作为一个单元的一组有序的数据库操作,单元是不可分割的,如果一组数据的所有操作都执行成功,事物完成,进行事物提交(commit),其修改作用于所有数据库进程。有一个操作执行失败,事务执行失败进行回滚(rollback),该事务所有操作的影响被取消;



原子性(Atomicity)

事物的操作要么全部执行成功提交,要么全部失败进行事物回滚,执行成功,对数据的改变将作用于其它数据库,执行失败,将不对其它数据库产生影响;



一致性(Consistency)

事务的执行使数据库从一个状态到另一个状态,状态必须保持一致性,比如两个人进行转账,两个的总金额是1000,不过他们进行了多少次转账(事务),两个人的总额1000是不变的,这就是一致性状态;



持久性(Osolation)

事务执行成功,对数据库数据的修改是永久性的,即使服务器宕机,也不会丢失已提交事务的操作;



隔离性(durability)

多个线程并行对表执行事务,每个事务对其它事务都是隔离互不影响的,比如有两个线程A和B对同一数据S进行事务执行,线程A在获取数据S时,线程B的事务要么已经提交结束,要么还未执行



二、事务四个隔离级别

数据库隔离的四个级别分别是:1、读取未提交;2、读取已提交;3、可重读;4、可串行化。隔离级别采取不同的锁类型来实现,若读取的是同一个数据可能发生脏读、幻读等问题



读未提交(Read Uncommitted)

在该隔离级别,所有事物都可以看到其它事务未提交的执行结果,事务可读取其它事务未提交的数据;也就是“脏读”



读已提交(Read Committed)

事务只能看见其它事务已经提交的结果数据,在执行查询操作期间,同一事务的其它操作可能在这一操作期间进行了commit,到查询的结果集和上次查询的结果集不一样,也就是“不可重复读”



可重复读 (repeatable Read)

MySql的默认隔离级别,保证同一事务的不同操作在并发读取的行数据是一样的。在事务读取某一范围的数据期间,不保证其它事务对该范围写入新行,造成事务下次查询的时候,多了新的数据行,也就是所谓的**“幻读”**,Innodb通过版本控制解决了这一问题。



序列化(Serializable)

隔离的最高级别,通过强制让事务有序执行,解决幻读等问题。事务执行期间,对每个数据行加了共享锁,可能会引起其它事务查询超时等现象;



三、脏读、幻读、不可重复读



脏读(Drity Read )

事务读取了其它事务执行未提交的数据行



幻读(Phantom Read)

事务在检索期间,其它事物是数据执行了更新操作,导致前后两次检索的数据不一样



不可重复度 (Nonrepeatable Read)

事物在检索期间,同一事物的不同操作(实例)对数据行修改后进行了commit,导致前后检索的数据行不一致



与隔离级别的关系

隔离级别 脏读 不可重复读 幻读
读未提交 + + +
读已提交 x + +
可重复读 x x +
可序列化 x x x



版权声明:本文为tiantian929原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。