
在我们系统中有一张表它的查询概率非常高。 最近有个需求,需要对这个表增加一个字段 ,然而在增加字段的时候发现系统中有多个业务出现了超时 *** 作,那么这个是什么原因导致的呢?经过查阅资料发现是数据库的 MDL锁+事务导致 的。
MDL锁属于表级别的元数据锁。 表级别锁分为数据锁和元数据锁,通常我们说的加锁一般指的是加的数据锁。跟数据锁一样,元数据锁也分读锁和读写锁。
MDL不需要显示使用,在进行表 *** 作时会自动加上 。当对表进行增删改查时,会自动加上MDL读锁;当要对表进行加减字段的结构修改时,会自动加上MDL写锁。
MDL锁的存在,其实是为了保证数据的一致性。 想象一下,假如没有MDL锁,一个查询在遍历表数据的过程中,另外一个线程执行了ALTER TABLE t DELETE COLUMN 'col_1'把col_1这一列删掉了,那查询结果就乱了,结果中是否应该有这一列数据?
:表示正常往下执行
:表示卡住了,即无法往下执行。
解释:
步骤 1 2 正常执行。执行步骤2 时,会申请表customer的MDL的 SHARED_READ 锁。
步骤3 会卡住, 因为此时会申请表customer的MDL的EXCLUSIVE锁,但是事物一的事物没有提交,此时是无法申请到EXCLUSIVE锁,因为它们是互斥的。
步骤4 也会卡住,因为EXCLUSIVE锁和SHARE_READ锁是互斥的, 且EXCLUSIVE锁的优先级更高 ,所以步骤4 也会卡住。
步骤5 事物提交,释放表的SHARE_READ锁,之后就可以执行6 和7 的 *** 作了。
如果先执行事务二,在执行事务三,则是可以成功的,因为alter数据ddl语句,和事物无关。
因此在我们开发的过程中,需要避免大的事务 *** 作,防止占有锁的时间过长。
举例说明MDL 与 S/N 的作用与区别:前者为生产商的产品序列号,后者为产品型号,型号为商业参数,序列号为企业产品管理使用。1、MDL字符串(条码),表示设备产品型号,如图中 WD3200AAJS。WD为西数产品标志,其后的3200为硬盘容量,即3200 X 100MB = 320GB。后面的字母含义:
① A ,代表硬盘外形尺寸为3.5英寸规格;
② A ,民用级硬盘,鱼子酱系列;
③ J ,表示盘片转速 7200转/分,8MB缓存;
④ S ,支持 SATA 3Gb/s(SATA2)。
2、S/N 为产品序列号,由字母与数字混合组成的字符串,如 WCAV2T609773。S/N序列号也称“产品 ID”,如同身份z的作用,是企业产品管理数据库中,管理产品信息数据的重要识别代码。其含义中包括该产品的生产批号、生产日期、产地、技术规格等信息,当去官网验明产品正身时,是必须提供该代码才能查询。
方法和详细的 *** 作步骤如下:
1、第一步,打开matlab软件,依次单击“新建”-->“脚本”选项,见下图,转到下面的步骤。
2、第二步,完成上述步骤后,输入以下代码,见下图,转到下面的步骤。
3、第三步,完成上述步骤后,单击另存为name.m文件,见下图,转到下面的步骤。
4、第四步,完成上述步骤后,在命令行窗口中输入name文件的名称,然后单击运行以成功输出 *** 作结果,见下图。这样,就解决了这个问题了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)