MySql教程

MySQL事务以及脏读,虚读,幻读

本文主要是介绍MySQL事务以及脏读,虚读,幻读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

事务的隔离级别
事务的四大特性 ACID
事务特性 含义
原子性(Atomicity)
每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功,要么都失败。
一致性(Consistency)
事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的总金额是 2000,转账后 2 个人总金额也是 2000
隔离性(Isolation) 事务与事务之间不应该相互影响,执行时保持隔离的状态。
持久性(Durability) 一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。

一、并发访问引起的问题

事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题。

并发访问的问题以及含义

脏读:

一个事务读取到了另一个事务中尚未提交的数据,例如我开启了两个事务,其中一个事务修改了另一个事务正在查看的值,但是还没有提交,此时第二个事务读取到的是已经修改的值,这就是脏读,因为如果第一个事务可以选择提交也可以选择回滚,那么就会对数据的安全造成问题。
演示:

不可重复读:

一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题。一样的,我开启了两个事务,第一个事务正准备修改某个数据,第二个事务此时已经查询了一次还没修改的值,此时第二个事务选择了提交修改(commit),而第二个事务在同一个事务里查询的时候发现数据居然改变了,和第一次在同一个事务里查询的居然不一样,这就是不可重复读。

幻读:

一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题。一样是两个事务,此时第一个线程查询了一下数据,而第二个数据在他查询完毕后刚刚好插入了一个数据,此时在同一个事务里再一次读取时,第一个事务再一次读取时发现数据数量变多了,这就是幻读。

二、解决并发问题

MySQL 数据库有四种隔离级别,默认的隔离级别是repeatable read
查看方法:SELECT @@tx_isolation;
修改方法:SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED(以下四种类型);
上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。

级别     名字    隔离级别      脏读     不可重复读      幻读
1     读未提交 read uncommitted    是       是        是
2     读已提交  read committed     否       是        是   
3     可重复读  repeatable read     否       否         是
4     串行化     serializable     否       否        否

隔离级别越高,性能越差,安全性越高。
视频学习

这篇关于MySQL事务以及脏读,虚读,幻读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!