您的位置 首页 php

mysql共享锁及排它锁

目录

  • 概述
  • 共享锁
  • 排他锁
  • 共享锁与排他锁小结
  • php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之 Mysql进阶 学习的第 篇文章:mysql共享锁及排它锁

  • 第一篇:mysql共享锁及排它锁

mysql锁机制分为表级锁和行级锁

共享锁

我们有如下测试数据:

现在我们对id=1的数据行共享锁查询,这里会使用begin开启事务,而不关闭事务,这样做是用来测试,因为 提交事务或回滚事务就会释放锁

共享锁sql分析实例

打开一个查询窗口

 BEGIN;
SELECT * FROM area WHERE id=1 LOCK IN SHARE MODE
  

查询结果如下:

此时我们没有提交事务,共享锁没有被释放。

实例1:

这时候我们新开一窗口,对id=1的数据行修改下数据试试

 UPDATE area SET area_name='北京市2' WHERE id=1  

运行结果如下:

一直在运行中。

原因是 共享锁没有被释放

实例2:

这时我们再新开一个窗口,对id=1的数据行读取( 不加锁机制 )试试

可以读取数据

实例3:

这时我们再新开一个窗口,对id=1的数据行读取(加读锁机制)试试

也可以读取数据

由此得出以下结论:

1.共享锁的行不可以被修改(实例1)

2.共享锁的行可以不加任何锁读取(实例2)

3.共享锁的行可以加读锁读取(实例3)

排他锁

mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁

select语句默认不会加任何锁类型,

如果加排他锁可以使用select …for update

加过排他锁的数据行在其他事务中是不能修改数据的,

也不能通过for update和lock in share mode锁的方式查询数据,

但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制

排他锁sql分析实例

打开一个窗口,现在我们对id=1的数据行排他查询

此时我们没有提交事务,排他锁没有被释放

实例4:

新开一个窗口,对id=1的数据行排他锁方式读取试试

一直在运行中。原因是排他锁没有被释放

实例5:

再新开一个窗口,对id=1的数据行共享锁方式读取试试

一直在运行中。原因是排他锁没有被释放

实例6:

再新开一个窗口,对id=1的数据行进行普通查询试试

可以读取到数据

由此得出以下结论:

1.排他锁的行不可以再加排他锁(实例4)

2.排他锁的行可以不加读锁(实例5)

1,2两点简化之排他锁的行不可以再加任何锁

3.排他锁的行可以普通读取(实例6)

共享锁与排他锁小结

排他锁与共享锁不能存在同一数据上

排他锁与排他锁也不能在同一数据上

共享锁与共享锁可以在同一数据上。

不用锁的查询可以读取加锁(共享锁,排他锁)的同一行数据

php7进阶到架构师相关阅读

最后,欢迎大家留言补充,讨论~~~

文章来源:智云一二三科技

文章标题:mysql共享锁及排它锁

文章地址:https://www.zhihuclub.com/153291.shtml

关于作者: 智云科技

热门文章

网站地图