MySQL中原数据锁是系统自动控制添加的,对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁。
原数据锁的作用是为了保护表原数据的一致性,如果在表上有活动事务的时候,不可以对元数据进行写入操作。也就是为了避免DML和DDL之间的冲突,保证读写的正确性。
说白了就是,在对数据表进行读写操作的时候,不能进行修改表结构的操作。
如上图所示,在执行select操作的时候,MySQL会自动加上shared_read锁,在insert,update,delete以及selectforupdate操作的时候会加上shared_write锁,这两类锁是兼容的。
在执行altertable操作的时候,会加上exclusive锁,这个锁与shared_read和shared_write锁是互斥的,换句话说在做查询和更新表数据的时候,是不能够修改表结构的。
来看个例子
首先开启事务,使用select语句会针对表加上shared_read的共享锁
begin;
select*fromcourse;
此时查看原数据锁的信息
selectobject_type,object_schema,object_name,lock_type,lock_durationfromperformance_schema.metadata_locks;
通过上图我们可以发现,course表加上了shared_read锁。
接着,开启另外一个事务,记住刚才的事务不要