对于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";
//表的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); 

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中
  2. linux下安装mysql5.7.17及简单配置
  3. 新版react踩坑总结
  4. Android 获取全部应用
  5. Html 5+
  6. 【Masonry】使用技巧 - 篇一
  7. SPL学习 迭代器
  8. DSP6455 DSP/BIOS中断配置问题(是否需要ECM-事件组合以及实例)
  9. Netbeans7.0完美中文+Consolas字体显示配置(亲测可用)
  10. 什么是Web Service?
  11. WEB打印插件Lodop
  12. C#编辑基础笔记
  13. "fatal: protocol error: bad line length character: No This"
  14. JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
  15. 使用jquery的方法和技巧
  16. 云计算学习(5-1)云平台产品介绍-华为的FusionCloud产品
  17. FFmpeg示例程序合集-批量编译脚本
  18. cesium 之自定义气泡窗口 infoWindow 篇
  19. 强大的图片展示插件,JQuery图片预览展示插件
  20. 【Java】快速排序的非递归实现

热门文章

  1. Android开源项目发现---Layout 篇(持续更新)
  2. Java Entry使用
  3. C#程序集使用强名字(Strong Name)签名/强名称签名
  4. King(差分约束)
  5. C++运行字符编码于MSVC和GCC之间的区别
  6. Windows Server基础架构云参考架构:硬件之上的设计
  7. 【转】iOS开发者申请发布证书及真机调试图文详解
  8. MVC Model Binder 规则
  9. 为虚拟机搭建MacOSX系统
  10. Object-c 基础总结