MySQL基础07-事务

一、简介

MySQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster。另外还有一些第三方存储引擎也支持事务,比较知名的包括XtraDB和PBXT。

事务的4大特性ACID。ACID表示原子性、一致性、隔离性和持久性。一个很好的事务处理系统,必须具备这些标准特性。

二、事务的ACID特性

1、原子性(Atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。

2、一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(其实原子性和隔离性间接的保证了一致性)

3、隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。后面我们讨论隔离级别(Isolation level)的时候,会发现为什么我们要说“通常来说”是不可见的。

4、持久性(durability)
一旦事务提交,则其所做的修改就会永久保存到数据库中。

三、隔离级别

而我们最常说的隔离性其实有对应的隔离级别,MySQL规定的隔离级别有4种,分别是:

1、READ UNCOMMITTED(读未提交)
在此级别里,事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,也就是会产生脏读(Dirty Read),在实际应用中一般很少使用。

2、READ COMMITTED(读已提交)
大多数数据库系统的默认隔离级别都是它(但是MySQL不是),它能够避免脏读问题。这个级别有时候也叫做不可重复读(nonrepeatable read),因为再次执行相同的查询,可能会得到不一样的结果。

3、REPEATABLE READ(可重复读)
该隔离级别是MySQL默认的隔离级别,该级别保证了在同一个事务中多次读取同样记录的结果是一致。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。(注:这里说的无法解决是MySQL定义层面,对于InnoDB引擎则完美的解决了幻读的问题,如果你正在使用InnoDB引擎,可忽略)

4、SERIALIZABLE(可串行化)
该隔离级别是级别最高的,它通过锁来强制事务串行执行,避免了前面说的所有问题。在高并发下,可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,因为RR级别解决了所有问题。

注:执行select @@global.tx_isolation,可以确定数据库的隔离级别。

MySQL可以通过执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别。新的隔离级别会在下一个事务开始的时候生效。可以在配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别:mysql > SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

参考

1、《高性能MySQL》 [美]Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko 著
2、 蹲厕所的熊谈谈MySQL-InnoDB存储引擎事务的ACID特性
备用地址:https://view.inews.qq.com/a/20180427G1I97X00

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