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

事物是指作为一个单元的一组有序的数据库操作,单元是不可分割的,如果一组数据的所有操作都执行成功,事物完成,进行事物提交(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++
可重复读xx+
可序列化xxx
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐