mysql锁表解锁后还在锁_mysql 锁表和解锁语句

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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值