InnoDB锁定模式
InnoDB实现标准行级锁定,在这里有两种类型的锁: locks:
· 共享的(S)锁允许一个事务去读一行(tuple)。
· 独占的锁(X)允许一个事务更新或删除一行。
如果事务A 在tuple t上持有独占锁定,来自不同事务B的对t上任一类型的锁的请求不被马上许可,取而代之地,事务B 不得不等待事务t释放在tuple t上的锁。
如果事务 A 在tuple t上持有一个共享的锁(S),那么
· 来自不同的事务B对在t 上X的锁定请求不能被马上许可。
· 来自不同的事务B对在t 上S的锁定请求可以被马上获准。因此A和B持有t上的S锁定。
不仅如此,InnoDB支持多间隔尺寸锁定,它允许记录锁和对整个表的锁共存。要使得多间隔尺寸级别的锁定实际化,额外类型的锁,被称为intention locks被使用。在InnoDB中,意图锁定是表锁定。 对于一个事务,意图锁定之后理想的是指明在该表中对一个行随后需要哪一类型的锁定(共享还是独占)。有两种意图锁被用在InnoDB中(假设事务T 在表R中要求一个已指出的类型的锁):
· 意图共享(IS):事务T 意图给表T上单独的tuple设置S 锁定。
· 意图独占(IX):事务T 意图给这些tuple设置X 锁定。
意图锁协议如下:
· 在假设的事务可以获得对某假定行的S 锁定之前,它必须首先获得对包含该行的表的一个IS 或者更强的锁定。
· 在假设的事务可以获得对某假定行的X 锁定之前,它必须首先获得对包含该行的表的一个IX 锁定。
这些结果可以方便地用一个锁类型兼容矩阵来总结:
|
X |
IX |
S |
IS |
X |
冲突 |
冲突 |
冲突 |
冲突 |
IX |
冲突 |
兼容 |
冲突 |
兼容 |
S |
冲突 |
冲突 |
兼容 |
兼容 |
IS |
冲突 |
兼容 |
兼容 |
兼容 |
如果一个锁定与现在锁定兼容的话,它被授给一个委托事务。如果一个锁定与现存锁定冲突,它就不被授予一个委托事务。事务等待着直到冲突的现存锁定被释放掉。如果一个锁定请求与现存锁定相冲突,且不能被授予,因为它可能会导致死锁,一个错误产生。
因此,意图锁定不阻碍任何东西,除了完全表请求(比如LOCK TABLES ... WRITE)。IX 和IS锁定的主要目的是显示某人正锁定一行,或将要在表中锁定一行。
下列的例子演示当锁定请求可能会导致死锁之时一个错误会如何发生。例子中包括两个客户端A和B。
首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:
mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (1.07 sec)
mysql> INSERT INTO t (i) VALUES(1);
Query OK, 1 row affected (0.09 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.10 sec)
接着,客户端B开始一个事务并尝试从该表删除行:
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM t WHERE i = 1;
删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。
最后,客户端A也试图从表中删除该行:
mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction
因为客户端A需要一个X 锁定来删除该行,所以在这里发生死锁。尽管如此,锁定请求不被允许,因为客户端B已经有一个对X锁定的请求并且它正等待客户端A释放S锁定。因为客户端B之前对X 锁定的请求,被客户端A持有的S锁定也不能升级到X锁定。因此,InnoDB对客户端A产生一个错误,并且释放它的锁定。在那一点上,客户端B的锁定请求可以被许可,并且客户端B从表中删除行。
相关推荐
主要有两种类型:**意向共享锁**(IS)和**意向排他锁**(IX)。 - **意向共享锁**(IS)表示事务希望在未来某个时刻获取一个或多个共享锁。 - **意向排他锁**(IX)表示事务希望在未来某个时刻获取一个或多个排他...
例如,共享锁之间是兼容的,但共享锁与排他锁之间则不兼容。 - **死锁检测和预防算法:** InnoDB通过检测循环等待条件来识别死锁,并采取措施解决死锁,如回滚其中一个事务。 - **意向锁算法:** 用于管理和跟踪...
意向锁包括意向共享(IS)、意向排他(IX)和意向排他共享(SIX)。它们可以减少锁冲突的检查成本,提高性能。 - **意向共享(IS锁)**:表示事务计划读取表的一部分。 - **意向排他(IX锁)**:表示事务计划修改...
- 不同类型的意向锁之间不会发生冲突,而意向锁与行级锁之间会根据共享和排他的规则进行冲突判断。 了解这些锁的工作原理对于理解和优化MySQL事务的并发性能至关重要。在处理高并发场景时,正确使用锁能够防止死锁...
InnoDB还引入了多种类型的锁来解决不同场景下的需求,如共享锁、排他锁等。 **3、锁操作API** - `LOCK TABLES table_name [READ|WRITE];`:用于加表锁。其中`READ`表示加共享读锁,`WRITE`表示加排它写锁。 - `...
此外,InnoDB还使用意向锁(IS和IX)来支持多粒度锁定。行级锁是通过对索引项加锁实现的,这意味着只有通过索引检索数据时才会使用行级锁,否则将使用表锁。 **事务与并发问题:** 事务的并发处理会导致不可重复读...
- 按照锁的使用方式:共享锁(读锁)、排他锁(写锁) 2. 概念: - 行锁:只锁定单个数据行,允许其他事务同时读取同一表的其他行,减少了锁冲突,但可能导致死锁。 - 表锁:锁定整个表,提供较低的并发性,但...
当一个事务持有共享锁时,其他事务可以再获取共享锁,但不能获取排他锁;相反,如果事务持有排他锁,则任何其他事务都不能获取该行的任何类型的锁。 接下来,我们将讨论行级锁和表级锁。行级锁是MySQL中InnoDB存储...
- 表级锁是一种粒度较大的锁,它锁定的是整个表,分为读锁(共享锁)和写锁(排他锁)。 - 读锁(`SELECT ... LOCK IN SHARE MODE`)允许多个事务同时读取同一张表,但不允许写入。 - 写锁(`SELECT ... FOR ...
InnoDB支持共享(S)锁和排他(X)锁,还有意向锁(IS、IX)用于多行操作。 4. **缓冲池(Buffer Pool)**: InnoDB的缓冲池负责缓存数据和索引页,减少了磁盘I/O,提高数据库性能。合理配置缓冲池大小对于优化...
SQL Server 2000支持多种类型的锁,包括共享锁(S锁)、排他锁(X锁)、意向锁(IS、IX)、更新锁(U锁)和行版本控制锁(NRVLock)。共享锁允许读取数据,而排他锁则允许读取和写入。意向锁表示对更高级别锁定的...
- **锁的类型**:主要有读锁(共享锁)和写锁(排他锁)。读锁允许多个并发进程读取同一数据,但不允许写入;写锁则禁止其他进程同时读写。 - **锁的钥匙**:指的是获得锁的客户端才能执行解锁操作。这意味着,一旦...
- **意向共享锁**: 表示事务想要对某个表加共享锁。 - **意向排他锁**: 表示事务想要对某个表加排他锁。 **3. InnoDB 行锁优化建议** - **索引使用**: 尽可能通过索引进行数据检索,以避免升级为表级锁。 - **索引...
此外,InnoDB还支持意向锁(Intention Locks),为表级操作提供预判,如意向共享锁(IS锁)和意向排他锁(IX锁),它们不会阻塞其他行级别的S锁和X锁。 元数据锁(MDL,Metadata Locks)是MySQL服务器层的一种锁,用于...
首先,我们要理解锁的两种基本类型:共享锁(Shared Locks)和排他锁(Exclusive Locks)。共享锁允许一个事务读取一行数据,但不允许其他事务修改它。多个事务可以同时持有共享锁,实现读取数据的并发。而排他锁则...
InnoDB支持行级锁定,包括共享锁(S lock)和排他锁(X lock),以及意向锁(IS lock、IX lock)。这些锁在并发操作中起到防止数据冲突的作用。 五、外键约束 InnoDB是MySQL中唯一支持外键约束的存储引擎,这使得...