[数据库] 数据库锁:行锁和表锁

1.数据库锁

一般的关系型数据库均使用悲观锁,以实现事务隔离(或数据库软件需要的某些操作,如更改库属性)。

注意MVCC机制是解决读-写冲突,从而尽量减少锁的使用,并不是不使用锁或者替代了锁的使用。(写-写冲突还是需要依赖锁)

以InnoDB的MVCC机制为例,它是通过保存数据的快照形成版本链来实现的。

2.MVCC机制简述

对于同一个事务,在启动事务时会或为当前事务创建版本号,之后操作仅涉及当前版本号之前的索引,不会对之后的索引造成影响。

在RR隔离级别时:

1)select,仅查找早于当前事务版本的数据。确保事务读取到的行在事务开始前就存在并且不会被修改。

2)insert,为新增行保存当前事务的版本号。(更新在版本号列表顶部,或者新键版本号列表)

3)delete,将删除行当前事务版本号标记为删除。

4)update,insert和delete操作的组合,即保存当前事务的版本号,并将原有事务版本号标记为删除。

innodb会在后台开启一个单独的线程清理被标记为删除的行数据。这个过程叫做purge。这样delete和update操作不需要等待清除数据完成。

3.行锁和表锁

当插入数据时,一般需要锁定整个表,即使用“表锁”。

当更新数据时,需要锁定数据行,即使用“行锁”。

MVCC RR事务隔离级别时,也需要使用锁来解决幻读问题。

1)行锁

对一行或多行记录进行加锁。MySQL的行锁是基于索引加载的。

当进行update操作时,会对数据行加读写锁。

进行select操作时,会加写锁(加在对应的那个版本上)。

行锁的衍生有:记录锁(精准锁定某一行记录)、间隙锁(锁定一个区间)临键锁(MySQL默认实现)。

2)表锁

表锁对应非索引操作,例如全表扫描。

 

posted @ 2022-02-23 11:45  Cheung-10  阅读(3)  评论(0)    收藏  举报