通俗易懂的MySQL事务隔离

更多知识,请移步我的小破站:http://hellofriend.top

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。 仅从其定义来看,你可能难以理解什么是事物,接下来我们举个经典例子来说明事务的用途:

用户A向用户B转账,我们需要进行以下操作:从A账户中把余额读出来;对A账户做减法操作;把结果写回A账户中;从B账户中把余额读出来;对B账户做加法操作;把结果写回B账户中。

在以上这些操作中需要保证所有操作是一个整体,即:要么都成功,要么都不成功。 为了解决这种问题,我们引入了事务

ACID特性

数据库事务拥有以下4大特性: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

1. 原子性

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

简单来说就是操作成功了就成功了,一旦操作失败了就会放弃事务中已经执行的操作,回到事务刚开始的状态。

2. 一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

一致性就是说不管操作是否成功,总的数据不会发生改变。例如,A向B转账,A和B的总金额不发生变化。

3. 隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

例如,A在转账1亿给B(事务1),同时C又在转账3亿给A(事务2),不管事务1和事务2谁先执行完毕,最终结果必须是A账户增加2亿(而不是3亿),B增加1亿,C减少3亿。

事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性(序列化)要求数据库同一时间只执行一条事务,而这将会严重影响性能。

4. 持久性

持久性,意味着在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。也就是说,完成的事务是系统永久的部分,对系统的影响是永久性的,该影响即使出现致命的系统故障也将会一直保持。

事务并发造成的问题

更新丢失:当事务1更新失败时会回滚数据,而在回滚之前事务2若成功更新数据,则事务2更新成功后的数据会被回滚覆盖,造成更新丢失。

脏读:当事务1读取了事务2未提交的数据,而事务2执行失败进行回滚,则事务1读取到是数据就是无中生有的数据,即脏数据。

不可重复读:事务1读取某个数据后,事务2对其做了修改,当事务1再次读该数据时得到与前一次不同的值。

幻读:事务1读取在读取某范围数据时,事务2插入一条数据,当事务1再次读取这个范围数据时就不一样了,出现了一些幻数据。
例如:A先把所有人的余额清零,同时,B往表中插入了一条余额为100的数据。A提交以后,发现竟然还有100的数据,即发生幻读。

隔离性和隔离级别

隔离性

隔离性是通过锁实现的,当一个事务对某项数据进行更新操作的时候就会对数据加锁,从而防止其他事务对该数据的影响,锁的级别一般有3种,全局锁,表锁,行锁,MySQL中的InnoDB支持以上的三种锁,MyISAM不支持行锁。锁获取的时机是事务执行的第一句才开始锁住数据的,并不是在数据开启的时候获取的,当事务提交成功后才会释放锁。

隔离级别

隔离级别有4种从低到高分别是读未提交(Read uncommitted)、读提交(Read committed)、重复读(Repeatable read)、序列化(Serializable)。

读未提交(Read uncommitted)

从名称中就可以看出,读未提交,即一个事务可以读另一个事务未提交的数据,简单来说就是一个事务修改了某个数据,当它还没提交的时候,另一个事务读取该数据的时候,会读取到修改后的数据,即使修改的事务还没有提交。这种隔离级别解决了更新丢失,当一个事务写时其他事务可读不可写

读提交(Read committed)

从名称也可以看出来,读提交,一个事务要等另一个事务提交后才能读取数据,即事务期间独占数据,其他数据不能对该数据进行读写操作。这种级别解决了脏读和更新丢失,当一个事务写时其他事务不可读写

重复读(Repeatable read)

重复读,即一个事务重复读的数据是相同的,就是当一个事务对数据进行读操作的时候,其他事务不能对其进行修改但可读。这种隔离级别解决了脏读,更新丢失和不可重复读,一事务读时其他事务可读不可写

序列化(Serializable)

这是最高的隔离级别,所有的事务只能一个接一个的执行,可以避免脏读、不可重复读与幻读。但这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

下面总结一下各种隔离级别可避免的问题:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章