说到数据库事务,想到的就是要么都做修改,要么都不做。或者是ACID的概念。其实事务的本质就是锁和并发和重做日志的结合体。那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的。
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)
一.隔离性其实隔离性的实现原理就是锁,因而隔离性也可以称为并发控制、锁等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离。再者,比如操作缓冲池中的LRU列表,删除,添加、移动LRU列表中的元素,为了保证一致性那么就要锁的介入。InnoDB使用锁为了支持对共享资源进行并发访问,提供数据的完整性和一致性。那么到底InnoDB支持什么样的锁呢?我们先来看下InnoDB的锁的介绍:
InnoDB中的锁你可能听过各种各样的InnoDB的数据库锁,gap锁啊,共享锁,排它锁,读锁,写锁等等。但是InnoDB的标准实现的锁只有2类,一种是行级锁,一种是意向锁。
InnoDB实现了如下两种标准的行级锁:
共享锁(读锁 S Lock),允许事务读一行数据
排它锁(写锁 X Lock),允许事务删除一行数据或者更新一行数据
行级锁中,除了S和S兼容,其他都不兼容。
InnoDB支持两种意向锁(即为表级别的锁):
意向共享锁(读锁 IS Lock),事务想要获取一张表的几行数据的共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(写锁 IX Lock),事务想要获取一张表中几行数据的排它锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
首先解释一下意向锁,以下为意向锁的意图解释:
The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.