Mysql实例mysql如何锁定单个表

Mysql实例mysql如何锁定单个表,第1张

概述介绍《Mysql实例mysql如何锁定单个表》开发教程,希望对您有用。

《MysqL实例MysqL如何锁定单个表》要点:
本文介绍了MysqL实例MysqL如何锁定单个表,希望对您有用。如果有疑问,可以联系我们。

导读:例子,MysqL锁定单个表.MysqL>lock table userstat read; MysqL>unlock tables;分析:页级的典型代表引擎为BDB. 表级的典型代表引...

例子,MysqL锁定单个表.
 MysqL数据库

MysqL>lock table userstat read;
MysqL>unlock tables;

分析:
页级的典型代表引擎为BDB.
表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM.
行级的典型代表引擎为INNODB.
-我们实际应用中用的最多的就是行锁.MysqL数据库

行级锁的优点:
1)、当很多连接分别进行不同的查询时减小LOCK状态.
2)、如果出现异常,可以减少数据的丢失.因为一次可以只回滚一行或者几行少量的数据.MysqL数据库

行级锁的缺点:
1)、比页级锁和表级锁要占用更多的内存.
2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写 *** 作而不是读 *** 作.
3)、容易出现死锁.
对于写锁定如下:
1)、如果表没有加锁,那么对其加写锁定.
2)、否则,那么把请求放入写锁队列中.
对于读锁定如下:
1)、如果表没有加写锁,那么加一个读锁.
2)、否则,那么把请求放到读锁队列中.
当然我们可以分别用low_priority 以及high_priority在写和读 *** 作上来改变这些行为.MysqL数据库

如果想要在一个表上做大量的 INSERT 和 SELECT *** 作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里.MysqL数据库

可以用以下命令实现:
 MysqL数据库

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 语句时捕获页锁的,而不是在事务的开始就这么做.MysqL数据库

行级锁的优点有:
在很多线程请求不同记录时减少冲突锁.
事务回滚时减少改变数据.
使长时间对单独的一行记录加锁成为可能.
行级锁的缺点有:MysqL数据库

比页级锁和表级锁消耗更多的内存.
当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源.
当需要频繁对大部分数据做 GROUP BY *** 作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕.
使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了.
表级锁在下列几种情况下比页级锁和行级锁更优越:MysqL数据库

很多 *** 作都是读表.
在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:
 MysqL数据库

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数据库

表级锁和行级锁或页级锁之间的不同之处:
将同时有一个写和多个读的地方做版本(例如在MysqL中的并发插入).
数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图.
其它名有:时间行程,写复制,或按需复制.MysqL数据库

例子:
 MysqL数据库

//执行SQL语句 锁掉stat_num表
$sql = "LOCK tableS stat_num WRITE"; //表的WRITE锁定,阻塞其他所有mySQL查询进程
$DatabaseHandler->exeCute($sql);
//执行更新或写入 *** 作
$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); 总结

以上是内存溢出为你收集整理的Mysql实例mysql如何锁定单个表全部内容,希望文章能够帮你解决Mysql实例mysql如何锁定单个表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1159517.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存