Mysql锁定表/解锁句法

转载 2006年06月08日 13:28:00

6.7.2 LOCK TABLES/UNLOCK TABLES 句法

LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES

LOCK TABLES 为当前线程锁定表。UNLOCK TABLES 释放当前线程拥有的所有锁定。当线程发出另一个 LOCK TABLES,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。

为了在 MySQL 4.0.2 使用 LOCK TABLES ,你必须拥有一个全局的 LOCK TABLES 权限和一个在相关表上的 SELECT 权限。在 MySQL 3.23 中,你对该表需要有 SELECTinsertDELETEUPDATE 权限。

使用 LOCK TABLES 的主要原因是,仿效事务处理或在更新表时得到更快的速度。此后会有更详细的描述。

如果一个线程在一个表上得到一个 READ 锁,该线程 (和所有其它线程) 只能从表中读取。如果一个线程在一个表上得到一个 WRITE 锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。

READ LOCALREAD 之间的不同就在于,当锁被加载时,READ LOCAL 允许非冲突(non-conflicting) INSERT 语句执行。如果当你加载着锁时从 MySQL 外部操作数据库文件,这将仍不能被使用。

当你使用 LOCK TABLES 是地,你必须锁定所有你将使用的表,并且必须使用与你的查询中将使用的别名相同!如果你在一个查询中多次使用一个表(用别名),你必须为每一个别名获得一个锁。

WRITE 锁通过比 READ 锁有更高的权限,以确保更新被尽快地处理。这就意味着,如果一个线程获得一个 READ 锁,而同时另外一个线程请求一个 WRITE 锁,并发的 READ 锁请求将等待直到 WRITE 线程得到了锁并释放了它。你可以使用 LOW_PRIORITY WRITE 锁,当该线程在等待 WRITE 锁时,它将允许其它的线程获得 READ 锁。 你应该只使用 LOW_PRIORITY WRITE 锁,如果你确信这将是最后一次,当没有线程将拥有 READ 锁。

LOCK TABLES 工作如下:

  1. 以内部定义的次序排序所有被锁定的表 (从用户立场说,该次序是不明确的)。
  2. 如果一个表被以一个读锁和一个写锁锁定,将写锁放在读锁之前。
  3. 一次只锁定一个表,只到线程得到所有的锁定。

这个方案是为了确保,表锁定死锁释放。 对于这个模式你仍然有些其它事情需要知道:

如果你对一个表使用一个 LOW_PRIORITY WRITE 锁定,这就意味着,MySQL 将等待这个锁,直到没有线程请求一个 READ 锁。当线程得到了 WRITE 锁,并等待获得锁定表列表中的下一个表的锁定时,其它所有的线程将等待 WRITE 锁被释放。如果这在你的应用程序中会引起一个严重的问题,你应该考虑将你的某些表转换为事务安全表。

你可以使用 KILL 安全地杀死一个正在表锁定的线程。查看章节 4.5.5 KILL 句法

注意,你不应该 锁定你正在对其使用 INSERT DELAYED 的表。这是因为,在这种情况下,INSERT 是通过单独的线程完成的。

通常,你不需要锁定任何表,因为所有单 UPDATE 语句都是原子的;其它的线程无法干扰当前执行的 SQL 语句。当你无论如何希望锁定表时,这里有一些情况:

  • 如果你在一束表上运行许多操作,锁定你将要使用的表,这会更快一些。当然有不利的方面,其它线程将不能更新一个 READ 锁的表,并且没有其它线程要以读取一个 WRITE 锁的表。 在 LOCK TABLES 下,某些事运行得更快一些的原因是,MySQL 将不会转储清除被锁定表键高速缓冲,直到 UNLOCK TABLES 被调用 (通常键高速缓冲在每个 SQL 语句后都会被转储清除)。这将加速在 MyISAM 表上的插入、更新、删除。
  • 如果你在 MySQL 中正在使用一个不支持事务的存储引擎,如果你希望能确保没有其它的线程会出现在一个 SELECT 和 一个 UPDATE 之间,你必须使用 LOCK TABLES 。下面的示例显示为了安全地执行,这里需要LOCK TABLES
    mysql> LOCK TABLES trans READ, customer WRITE;
    mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
    mysql> UPDATE customer SET total_value=sum_from_previous_statement
    -> WHERE customer_id=some_id;
    mysql> UNLOCK TABLES;
    不使用 LOCK TABLES,将可能发生在 SELECTUPDATE 语句执行期间有另外一个线程可能在 trans 表中插入一行新记录。

通过使用递增更新 (UPDATE customer SET value=value+new_value) 或 LAST_INSERT_ID() 函数,你可以在很多情况下避免使用 LOCK TABLES

你也可以使用用户级锁定函数 GET_LOCK()RELEASE_LOCK() 解决一些情况,这些锁被保存在服务器上的一个哈希表中,并以 pthread_mutex_lock()pthread_mutex_unlock() 实现以获得高速度。查看章节 6.3.6.2 辅助功能函数

查看章节 5.3.1 MySQL 如何锁定表,以获取关于锁定方案的更多信息。

你可以使用 FLUSH TABLES WITH READ LOCK 命令以读锁锁定所有数据库中的所有表。查看章节 4.5.3 FLUSH 句法。如果你有一个可以及时建立文件快照的文件系统,例如 Veritas,这将是得到备份的非常方便方式。

注意:LOCK TABLES 不是事务安全的,在尝试锁定一个表之前,将自动地提交所有的活动事务。


相关文章推荐

Mysql锁定表/解锁句法

LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS al...

mysql lock table/unlock table 表锁/解锁

在某个地方看到有个例子,具体描述类似如下:商店现在某商品只有1件库存,然后A与B在网上进行下订,A与B几乎同时(或许也就差几毫秒,A比B快那么一点点)进行。 很明显是只有A才能成功下单的,B则会...

用户之间表的访问和账户的锁定与解锁

一:用户之间表的访问: 例如:wangzihu用户想访问system用户中的users表,命令如下 : grant select on users to wangzihu;(这是在用户为syst...

批量解锁被锁定的AD账户

因公司网络有客户端中了W32.Downadup病毒,此病毒会不停使用AD账户和不同密码组合尝试访问,公司域中有使用组策略,密码输入错误三次将锁定账号,从而导致很多AD账户被锁定。Active Dire...

oracle数据库锁定与解锁

查看锁定项:表锁定、行锁定等,如下代码 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK',...

Android 锁定屏幕 不可解锁

Android锁定屏幕这个玩意只是在MDM上有所应用,通过后台发送指令到Android上,或者是Android程序本身检测满足某一条件的时候,对Android手机进行锁屏操作,当前这种方法,只能通过硬...

Subversion使用“锁定-编辑-解锁”模型

转载:http://www.uml.org.cn/pzgl/200901098.aspSubversion使用与CVS相似的工作模型,也就是“拷贝-修改-合并”,但是有时候还是很有必要使用“锁定-编辑...

Oracle创建表空间、创建用户、授予权限、锁定、解锁以及删除用户等

Oracle创建表空间、创建用户、授予权限以及删除用户等 --创建表空间 CREATE TABLESPACE caiyl DATAFILE 'D:\Oracle\app\caiyl\oradata...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)