当前位置: 首页 > wzjs >正文

网站备案ip查询系统站长工具忘忧草社区

网站备案ip查询系统,站长工具忘忧草社区,做兼职什么网站,网站鼠标悬停动态效果代码表锁 若我们想对 user 表加锁,则加锁语句: //读锁 lock tables user read;//写锁 lock tables user write;它们遵循:读读共享、读写互斥、写写互斥 在这里,我们主要讨论以下话题:表锁除了会限制别的线程的读写外&…

表锁

若我们想对 user 表加锁,则加锁语句:

//读锁
lock tables user read;//写锁
lock tables user write;

它们遵循:读读共享、读写互斥、写写互斥
在这里,我们主要讨论以下话题:表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。

表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作

假设有两个表 t1t2,当线程 A 执行了 lock tables t1 read, t2 write;这个语句,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。不允许写 t1 ,不能访问其他表。----选自小林Coding-MySQL中的锁

1. 为什么持有 t1 读锁的线程 A,自己也不能写 t1?

这主要是为了防止“锁升级”导致的死锁。

我们先来理解 LOCK TABLES ... READ 的含义。当线程 A 执行 LOCK TABLES t1 READ 时,它其实是在向系统做出一个“承诺”:“在接下来的操作中,我只会读取 t1 表,我需要一个稳定不变的数据视图。”

如果系统允许线程 A 在持有读锁(共享锁)的情况下,再去尝试写入(需要排他锁),会发生什么?我们来看一个经典的死锁场景:

线程 A 执行 LOCK TABLES t1 READ;,成功获得了 t1 的读锁。

线程 B 在此时也执行 LOCK TABLES t1 READ;,它也可以成功获得 t1 的读锁,因为读锁是共享的。

现在,线程 AB 都持有 t1 的读锁。

线程 A 突然想更新数据,执行 UPDATE t1 SET ...;。要执行这个操作,它需要将自己的读锁升级为写锁。但是,由于线程 B 还持有读锁,线程 A 的写锁请求无法被满足,必须等待线程 B 释放读锁。于是,线程 A 开始阻塞等待。

线程 B 此时也想更新数据,执行 UPDATE t1 SET ...;。同样,它也需要将自己的读锁升级为写锁。但它发现线程 A 也持有读锁,所以它也必须等待线程 A 释放。于是,线程 B 也开始阻塞等待。

结果: 线程 A 在等线程 B 释放锁,而线程 B 也在等线程 A 释放锁。双方互相等待,形成了一个完美的死锁

为了从根本上杜绝这种“读锁升级”造成的死锁,MySQL 的设计者制定了一条简单而粗暴的规则:一旦你以 READ 模式锁定了某张表,那么在解锁之前,你(当前线程)就彻底失去了对这张表进行写操作的权限。 如果你预见到可能会写入,就必须在一开始申请 WRITE 锁。

2. 为什么线程 A 也不能访问其他未锁定的表?

这个规则同样是为了防止多表操作时产生死锁。

LOCK TABLES 命令的设计是:在一个会话中,一旦你决定使用表锁,就必须在一条命令里,把你接下来需要用到的所有表都“登记”并锁定起来。

如果你只锁了 t1t2,却在后续又去尝试访问 t3,这同样可能导致死锁。我们再看一个场景:

线程 A 执行 LOCK TABLES t1 WRITE;,成功锁定了 t1

线程 B 在此时执行 LOCK TABLES t3 WRITE;,成功锁定了 t3

现在,线程 A 持有 t1 的写锁,线程 B 持有 t3 的写锁。

线程 A 执行 SELECT * FROM t3;。它发现 t3 被线程 B 锁着,于是开始等待。

线程 B 执行 SELECT * FROM t1;。它发现 t1 被线程 A 锁着,于是也开始等待。

结果: 又一个死锁产生了。

为了避免这种情况,LOCK TABLES 命令要求你“一次性”获取所有你需要的锁。当你执行LOCK TABLES t1 READ, t2 WRITE;后,MySQL 会认为这就是你本次操作需要用到的所有表的“清单”。

对于清单上的表(t1, t2),你拥有了指定的权限。

对于所有未在清单上的表,MySQL 会隐式地认为你不需要访问它们,为了防止你后续的即兴操作引发死锁,干脆禁止你访问。

http://www.dtcms.com/wzjs/276999.html

相关文章:

  • wordpress不修改数据库更换域名英文seo兼职
  • 网站建设及报价格方案免费的外贸网站推广方法
  • 京东网站建设案例论文柳州网站建设哪里有
  • 汽车网站怎么做项目营销策划方案
  • 管理系统是网站吗重庆百度关键词优化软件
  • 中小型网站建设策划平谷头条新闻
  • 做课件用这15大网站优化手机流畅度的软件
  • 装修公司做网站好做吗qq营销
  • 语言互动网站建设百度电脑版下载安装
  • 网站建设方式可行性分析推广赚钱的微信小程序
  • 猪八戒网做动漫弹幕网站深圳谷歌推广公司
  • 做网站怎么赚钱的公司网站推广运营
  • 网站导航是怎么做的收录查询站长工具
  • 温州商城网站建设成人教育培训机构十大排名
  • 找有意者做阿里巴巴去哪个网站知乎营销平台
  • 企业网站怎做seo是什么单位
  • 织梦网站图片不显示营销策划方案怎么做
  • 唐尧文化 网站建设工作总结近一周的新闻大事热点
  • 做海南旅游网站的初衷seo辅助工具
  • 给个龙做罗拉的网站百度问答首页
  • 打开网页wordpress错误重庆seo网页优化
  • 如何做网站的登录日志指数基金怎么买才赚钱
  • 如何做微信网站建设成都seo专家
  • 会计信息网站建设的意思郑州百度网站快速优化
  • 吉林省做网站公司sem代运营费用
  • 医院做网站的费用多少郴州网络推广外包公司
  • 东莞企业建站收费产品推广百度seo关键词优化市场
  • flash网站链接怎么做怎么做好seo推广
  • 哪个网站简历做的好百度统计api
  • 网站建设与管理案例教程在线阅读湖州网站建设制作