10bet网址
MySQL内部手册


23.18.25 store_lock

目的

创建和释放表锁。

剧情简介

虚拟THR_LOCK_DATA (

lock_type)

飞*

THR_LOCK_DATA * *

enum thr_lock_type

lock_type

描述

这是store_lock方法。

handler::store_lock()的思想如下:

语句决定了表需要哪些锁,用于更新/删除/插入,我们得到WRITE锁,用于SELECT…我们得到读锁。

在将锁添加到表锁处理程序之前mysqld使用请求的锁调用存储锁。Store lock可以修改锁级别,例如,将阻塞写锁改为非阻塞写锁,忽略锁(如果我们根本不想使用MySQL表锁),或者为许多表添加锁(就像我们在使用MERGE处理程序时所做的那样)。

当释放锁时,也会调用store_lock()。在这种情况下,人们通常不需要做任何事情。

如果store_lock的参数是TL_IGNORE,这意味着MySQL请求处理程序存储与上次相同的锁级别。

从锁定调用。Cc通过get_lock_data()。

参数

  • lock_type

返回值

没有返回值。

使用

下面的示例来自存档存储引擎:

下面是一个如何设置行级锁定的例子。*/ THR_LOCK_DATA **ha_archive::store_lock(THD * THD, THR_LOCK_DATA **to, enum thr_lock_type lock_type) {if (lock_type == TL_WRITE_DELAYED) delayed_insert= TRUE;else delayed_insert= FALSE;if (lock_type != TL_IGNORE &&锁定。这里是我们进入行级锁的核心部分的地方。如果设置了TL_UNLOCK如果我们不做LOCK TABLE或DISCARD/IMPORT表空间,那么允许多个写入*/ If ((lock_type >= TL_WRITE_CONCURRENT_INSERT && lock_type <= TL_WRITE) && !thd->in_lock_tables && !thd->tablespace_op) lock_type = TL_WRITE_ALLOW_WRITE;/*在INSERT INTO t1 SELECT…从t2…MySQL将在t2上使用TL_READ_NO_INSERT锁,这将与TL_WRITE_ALLOW_WRITE冲突,阻塞对t2的所有插入。将锁转换为普通读锁,以允许对t2进行并发插入。 */ if (lock_type == TL_READ_NO_INSERT && !thd->in_lock_tables) lock_type = TL_READ; lock.type=lock_type; } *to++= &lock; return to; }

以下是对于不需要降级锁的存储引擎的最小实现:

THR_LOCK_DATA **ha_tina::store_lock(THD * THD, THR_LOCK_DATA **to, enum thr_lock_type lock_type){/*注意,如果锁类型是TL_IGNORE,我们不更新锁。*/ if (lock_type != TL_IGNORE && lock. type)type= = TL_UNLOCK) lock.type=lock_type;/*是store_lock()方法的核心,它的主要目的是将(可能更改的)锁级别存储到提供的内存中*/ *to++= &lock;返回;}

另请参阅ha_myisammrg: store_lock ()对于更复杂的实现