mysql 锁表和解锁语句
对于 MySQL 来说, 有三种锁的 级别:页级 、表级、行 级 页级的典 型代表引擎为 BDB 。
表级的典 型代表引擎为 MyISAM,MEMORY 以及很久 以前的 ISAM 。 行级的典 型代表引擎为 INNODB 。
- 我们实 际应用中用 的最多的就 是行锁 。 行级锁的 优点如下:
1 )、当很多 连接分别进行 不同的查询时 减小 LOCK 状态。
2 )、如果出 现异常,可以 减少数据的丢 失。因为一次 可以只回滚一 行或者几行少 量的数据 。
行级锁的 缺点如下:
1 )、比页级 锁和表级锁要 占用更多的内 存。
2 )、进行查询 时比页级锁和 表级锁需要的 I/O 要多,所以我们 经常把行级锁 用在写操作而 不 是读操作 。
3 )、容易出 现死锁。 对于写锁 定如下:
1 )、如果表 没有加锁,那 么对其加写锁 定。 2 )、否则, 那么把请求放 入写锁队列中 。 对于读锁 定如下:
1 )、如果表 没有加写锁, 那么加一个读 锁。 2 )、否则, 那么把请求放 到读锁队列中 。
当然我们 可以分别用 low_priority 以及 high_priority 在写和读 操作上来改变 这些行为。 如 果想 要在 一 个表 上做 大量 的 INSERT 和 SELECT 操 作, 但是 并 行的 插入 却不 可 能 时,可以将记 录插入到临时 表中,然后定期 将临时表中的 数据更新到实 际的表里。可以用以 下命令实 现:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB 使用行级 锁, BDB 使用页级 锁。对于 InnoDB 和 BDB 存储引擎 来说,是可 能产生死 锁的。这是因为 InnoDB 会自动捕 获行锁, BDB 会在执行 SQL 语句时捕 获页锁 的,而不 是在事务的开 始就这么做。
行级锁的 优点有:
在很多线 程请求不同记 录时减少冲突 锁。 事务回滚 时减少改变数 据。
使长时间 对单独的一行 记录加锁成为 可能。 行级锁的 缺点有:
比页级锁 和表级锁消耗 更多的内存。
当在大量 表中使用时, 比页级锁和表 级锁更慢,因 为他需要请求 更多的所资源 。 当需要频 繁对大部分数 据做 GROUP BY 操作或者 需要频繁扫描 整个表时 ,就明显的 比
其它锁更 糟糕。
使用更高 层的锁的话 ,就能更方 便的支持各种 不同的类型应 用程序 ,因为这种 锁的开销
比行级锁 小多了。
表级锁在 下列几种情况 下比页级锁和 行级锁更优越 : 很多操作 都是读表。
在严格条 件的索引上读 取和更新,当 更新或者删除 可以用单独的 索引来读取得 到时:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT 和 INSERT 语句并发 的执行 ,但是只有 很少的 UPDATE 和 DELETE 语句。 很多的扫 描表和对全表 的 GROUP BY 操作,但 是没有任何写 表。 表级锁和 行级锁或页级 锁之间的不同 之处还在于:
将同 时有一 个写和 多个读 的地方 做版本 (例如 在 MySQL 中的 并发插 入 )。也 就是说 , 数据库 / 表支持根 据开始访问数 据时间点的不 同支持各种不 同的试图。其它名有 :时间行程 , 写复制, 或者是按需复 制。
// 执行 SQL 语句 锁掉 stat_num 表
$sql = "LOCK TABLES stat_num WRITE";
查询进程
$DatabaseHandler->exeCute($sql);
// 执行更新 或写入操作
// 表的 WRITE 锁定 ,阻塞其 他所有 mysql
$sql
=
"UPDATE
stat_num
SET
`correct_num`=`correct_num`+1
WHERE
stat_date='{$cur_date}'";
$DatabaseHandler->exeCute($sql);
// 当前请求 的所有写操作 做完后,执行 解锁 sql 语句
$sql = "UNLOCK TABLES";
$DatabaseHandler->exeCute($sql);