mysql 14.12_16.14.12. store_lock

16.14.12. store_lock

目的

创建和释放表锁定。

概要virtual THR_LOCK_DATA **

store_lock

(thd,

to,

lock_type);;

THR_LOCK_DATA **to

;

enum

thr_lock_typelock_type

;

描述

这是store_lock方法。

下面介绍了关于handler::store_lock()的概念:

该语句决定了在表上需要何种锁定。对于updates/deletes/inserts,我们得到WRITE锁定;对于SELECT...,我们得到读锁定。

将锁定添加到表锁定处理程序之前(请参见thr_lock.c),mysqld将用请求的锁定调用存储锁定。目前,存储锁定能将写锁定更改为读锁定(或某些其他锁定),忽略锁定(如果不打算使用MySQL表锁定),或为很多表添加锁定(就像使用MERGE处理程序时那样)。

例如,Berkeley DB能够将所有的WRITE锁定更改为TL_WRITE_ALLOW_WRITE(表明正在执行WRITES操作,但我们仍允许其他人执行操作)。

释放锁定时,也将调用store_lock()。在这种情况下,通常不需要作任何事。

在某些特殊情况下,MySQL可能会发送对TL_IGNORE的请求。这意味着我们正在请求与上次相同的锁定,这也应被忽略(当我们打开了表的某一部分时,如果其他人执行了表刷新操作,就会出现该情况,此时,mysqld将关闭并再次打开表,然后获取与上次相同的锁定)。我们打算在将来删除该特性。

由get_lock_data()从lock.cc中调用。

参数thd

to

lock_type

返回值

无返回值。

用法

下述示例取自ARCHIVE存储引擎:

/*

Below is an example of how to setup row level locking.

*/

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 && lock.type == TL_UNLOCK)

{

/*

Here is where we get into the guts of a row level lock.

If TL_UNLOCK is set

If we are not doing a LOCK TABLE or DISCARD/IMPORT

TABLESPACE, then allow multiple writers

*/

if ((lock_type >= TL_WRITE_CONCURRENT_INSERT &&

lock_type <= TL_WRITE) && !thd->in_lock_tables

&& !thd->tablespace_op)

lock_type = TL_WRITE_ALLOW_WRITE;

/*

In queries of type INSERT INTO t1 SELECT ... FROM t2 ...

MySQL would use the lock TL_READ_NO_INSERT on t2, and that

would conflict with TL_WRITE_ALLOW_WRITE, blocking all inserts

to t2. Convert the lock to a normal read lock to allow

concurrent inserts to t2.

*/

if (lock_type == TL_READ_NO_INSERT && !thd->in_lock_tables)

lock_type = TL_READ;

lock.type=lock_type;

}

*to++= &lock;

return to;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值