Mysql的事务隔离级别详解

SQL事务有四大特性:原子性,一致性,隔离性,持久性

数据库引擎必须是InnoDB,因为只有InnoDB才支持事务

四大特性之隔离性

sql标准的定义了4类隔离级别,包括一些具体的原则来限定事务内外哪些是可见不可见的。低级别的的隔离级别一般支持更高的并发处理,并拥有更低的系统开销。

Read Uncommitted(读取 未提交的内容)

在该隔离级别,所有事务都可以看到其实未提交的事务的执行结果。本隔离级别很少用于实际应用,因为它性能不比其他级别好多少,读取未提交数据,称为脏读(dirty read)。

Read committed(读取 以提交的内容)

这是大多数数据库默认级别,但mysql不是。它满足了隔离的简单定义:一个事务只能看见已经提交的事务做出的改变。这种隔离级别 也支持所谓的不可重读 因为同一事务的其它实例在该实例处理期间可能会出现新的commit,所以同一select可能返回不同的结果。

Repeatable Read(可重读)

这是mysql默认的事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上会出现幻读,简单的说幻读指的的当用户读取某一范围的数据行时,另一个事务又在该范围插入了新行,当用户在读取该范围的数据时 会发现有新的幻影行。InnDB和Falcon储存引擎通过多版本并发控制机制解决了该问题。

Serializable(可串行化)

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

这四个隔离级别采取不用过的锁类型来实现,若读取的时是同一个数据的话,就容易发生问题。例如:
脏读(Dirty read):某个事务更新了一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个事务执行了rollback操作,则后一个读取数据就会出现不正确的数据。
不可重复读:在一个事物的两次查询数据中数据笔数不一致,这可能是两次查询的过程中出现了中间插入了一个事务更新的原有数据。
幻读:在一个事务的两次查询中数据不一致,例如有一个事务查询了几列数据,而另一个事务却在此时插入了几列新的数据,先前事务在接下来的查询中,就会发现有几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在mysql中,实现了这四种隔离级别,分别有可能产生的问题如下:
Mysql的事务隔离级别详解_第1张图片
下面将演示下四种隔离级别的测试:
一,将A的隔离级别设置为Read Uncommitted(读未提交的数据)
在B未更新数据之前
客户端A:
Mysql的事务隔离级别详解_第2张图片
B更新数据,但并未提交 突然回滚
客户端B:
Mysql的事务隔离级别详解_第3张图片
客户端A:读取出现未提交的数据
Mysql的事务隔离级别详解_第4张图片
经过上面的例子可以得出以下结论:用户端B未提交数据,用户端A可以读出数据。造成了脏读现象,未提交读数据是最低级隔离级别。
二,Read committed(读以提交的数据)
用户端A:

Mysql的事务隔离级别详解_第5张图片
用户端B:
B更新数据并提交数据
Mysql的事务隔离级别详解_第6张图片
用户端A:读取第一次未出现提交数据,读取第二次出现以提交数据
Mysql的事务隔离级别详解_第7张图片
经过上面例子得出结论,已提交读个隔离级别解决了脏读的问题,但是出现了不可重复读的问题,
即事务A在两次查询数据结果出现两次不同的结果,因为两次查询之间出现了事务B更新了一条数据。已提交读只允许读取以提交的记录,但不要求可重复读。
三,Repeatable Read(可重读)
A用户端:

Mysql的事务隔离级别详解_第8张图片
B用户端:
B更新数据
Mysql的事务隔离级别详解_第9张图片
用户端A: 可重读
Mysql的事务隔离级别详解_第10张图片
用户端B:
B插入数据并提交
Mysql的事务隔离级别详解_第11张图片
用户端A:
A中提交数据
只读以提交数据
Mysql的事务隔离级别详解_第12张图片
由上述例子中可得出结论:B更新和插入数据并提交B中可以查看到以提交数据,但是A中查看不到数据,但在A中提交就可以查看数据。可重复读隔离级别只允许读取以提交数据
四,可串行化
服务端A:
Mysql的事务隔离级别详解_第13张图片
服务端B:
Mysql的事务隔离级别详解_第14张图片
因为此时事务A的隔离级别为serializable,开始事务后,并没有提交,所以事务B只能等待。
服务端A: 提交事务
在这里插入图片描述
服务端B:
在这里插入图片描述
由上述例子得出结论:serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整得隔离级别,会锁定对应得数据表格,因而会有效率得问题。最高隔离级别。

你可能感兴趣的:(mysql)