发表于: 2020-08-19 23:21:17

1 1360


今天完成的事情

1. 了解 MVVC 与事务隔离级别

2. 全局锁、表锁与行锁


收获

1. MySQL 锁

全局锁、表级锁、行锁(由数据库引擎支持)


全局锁:对整个数据库实例加锁。

MySQL 全局锁命令

Flush table with read lock

全局锁之后整个库处于只读状态,其他的数据更新语句、数据定义语句和更新类事务的提交语句都会被阻塞。


a,使用命令锁数据库。

b,测试查询语句

c,测试更新语句提示被锁


如果数据库的连接异常断开,那么全局锁会消失,也可以使用命令 unlock tables

全局锁的应用场景是做全库逻辑备份。把整个库的每一个表都 select 出来存为文本。


2. 事务隔离

前面说到全局锁,能够满足我们的需求来备份某一时刻的数据库。但是缺点也非常明显,使用全局锁之后所有的增删改语句被阻塞,那么用户的一些正常请求也会无法处理。

为了达到备份数据库又不影响数据库处理正常的请求就需要引入事务隔离,在可重复读隔离级别下开启一个事务,同样可以保证我们获取到的是某一时刻的数据。


SQL 标准的事务隔离级别:

读未提交(read uncommitted):一个事务还没有提交就可以被其他的事务看到

读提交(read committed):一个事务提交之后它的变更才会被其他的事务看到

可重复读(repeatable read):一个事务执行的过程中查询到的数据与事务启动的时候看到的数据是一致的。

串行化(serializable):对于同一行记录,写操作会加上写锁,读操作会加上读锁。出现读写锁冲突的时候后一个事务只能在前一个事务提交之后才可以进行。


3. 表级锁

MySQL 又两种表级锁:表锁与元数据锁(meta data lock,MDL)

表锁的语法:lock tables ··· read/write

同样可以使用 unlock tables 或者主动断开连接来释放锁。

需要注意的是 lock tables 语法除了限制其他的线程之外也会限制本线程接下来的操作。


能够使用行锁级就不要使用表锁,表锁的影响太大。


元数据锁(MDL)不需要显示的使用,在访问一个表的时候会被自动加上,MDL 的作用是保证读写的正确性。防止查询的结果与表结构对不上

所以数据库在执行一个表的增删改查操作的时候会加上 MDL 读锁。需要对表做变更的时候需要加上写锁。


4. 行锁

MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 InnoDB 是支持行锁的,MyISAM 引擎就不支持行锁。

行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。




返回列表 返回列表
评论

    分享到