MySQL事务的四大特性及事务的隔离级别

MySQL事务的四大特性及事务的隔离级别

  • 事务的概念
  • 事务的四大特性ACID
    • Atomicity:原子性
    • Consistency:一致性
    • Isolation:隔离性
    • Durability:持久性
  • 事务的隔离级别
    • Read Uncommitted
    • Read Committed
    • Repeatable Read
    • Serializable
  • 隔离级别产生的问题
    • 脏读
    • 不可重复读
    • 幻读
  • MySQL操作隔离级别
    • 查看事务隔离级别
    • 修改事务隔离级别
    • MySQL设置事务提交方式

事务的概念

事务是用来保证一个业务操作的完整性,要么成功、要么失败、不允许部分成功、部分失败。

事务的四大特性ACID

Atomicity:原子性

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

Consistency:一致性

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态

Isolation:隔离性

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

Durability:持久性

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

事务的隔离级别

总的说,数据库事务无非就两种:读取事务(select)、修改事务(update,insert)。在没有事务隔离控制的时候,多个事务在同一时刻对同一数据的操作可能就会影响到最终期望的结果,通常有四种情况:
(1) 两个更新事务同时修改一条数据时,很显然这种情况是最严重的了,程序中无论如何也不能出现这种情况,因为它会造成更新的丢失!
(2) 一个更新事务更新一条数据时,另一个读取事务读取了还没提交的更新,这种情况下会出现读取到脏数据。
(3) 一个读取事务读取一条数据时,另一个更新事务修改了这条数据,这时就会出现不可重现的读取。
(4)一个读取事务读取时,另一个插入事务(注意此处时插入)插入了一条新数据,这样就可能多读出一条数据,出现幻读。

Read Uncommitted

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

MySQL事务的四大特性及事务的隔离级别_第1张图片

Read Committed

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…
MySQL事务的四大特性及事务的隔离级别_第2张图片

Repeatable Read

可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。
MySQL事务的四大特性及事务的隔离级别_第3张图片

Serializable

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

隔离级别产生的问题

脏读

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据,图一的数据就是产生了脏读现象

不可重复读

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。图二的数据就是产生了不可重复读的问题

幻读

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

MySQL操作隔离级别

查看事务隔离级别

select @@tx_isolation ;
MySQL事务的四大特性及事务的隔离级别_第4张图片

修改事务隔离级别

set tx_isolation=‘read-uncommitted’;

set tx_isolation=‘read-committed’;

set tx_isolation=‘repeatable-read’;

set tx_isolation=‘serializable’;

MySQL设置事务提交方式

MySQL数据库命令行默认采用 自动提交事务的方式,可以通过 select @@autocommit 来查看
MySQL事务的四大特性及事务的隔离级别_第5张图片
修改为手动提交方式
set autocommit = 0

你可能感兴趣的:(MySQL)