MySQL的事务隔离级别、锁机制、MVCC的原理
1、事务的概述
事务是数据库中一个单独执行的单元(Unit),它通常由高级数据库操作语言(例如 SQL)或编程语言(例如 C++、Java 等)书写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变;否则,事务就取消并回滚,更改无效。
事务必须满足四个属性,即:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),即 ACID 四种属性。
1.1 原子性(Atomicity)
原子性意味着事物的整体性和不可分割性,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全部执行,要么全部不执行,即不允许事务部分地完成,避免了只执行这些操作的一部分而带来的错误。原子性要求事务必须被完整执行。
1.2 一致性(Consistency)
一个事务执行之前和执行之后数据库数据必须保持一致性状态。数据库的一致性状态应该满足模式锁指定的约束,那么在完整执行该事务后数据库仍然处于一致性状态。为了维护所有数据的完整性,在关系型数据库中,所有的规则必须应用到事务的修改上。数据库额一致性状态由用户来负责,由并发控制机制实现,例如银行转账,转账前后两个账户金额之和应保持不变,由于并发操作带来的数据不一致性包括数据的修改、读“脏”数据、不可重复读和产生幽灵数据。
1.3 隔离性(Isolation)
隔离性也被称为独立性,当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与事务的操作隔离起来,不被其他正在进行的事务看到。隔离性是指每个事务在自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只在它完全被执行时才能看到。即使这样的一个系统中同时发生多个事务,隔离性也可以保证特定的事务在完成之前,其结果是不被公布的。
1.4 持久性(Durability)
持久性也被称为永久性,事务完成后,数据库管理系统(DMMS)保证它对数据库中的数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保存。持久性一般通过数据库备份与恢复来保证。
严格来说,数据库事务属性(ACID)都是由数据库管理系统来进行保证的,在整个应用程序运行过程中应用无须去考虑数据库的 ACID 实现。
关于 MySQL 事务的详细应用,请点击并浏览本博客的文章:《MySQL事务的应用》
2、事务的隔离级别
事务具有独立的空间,在 MySQL 服务器中,用户通过不同的会话执行不同的事务,在多用户环境中,许多 RDBMS 会话在任意指定时刻都是活动的。为了使这些事务互不影响&#