mysql锁

根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。

全局锁的典型使用场景是,做全库逻辑备份。

MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。

官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,

来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。

表级锁:

表锁的语法是 lock tables … read/write。

另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。

给一个小表加个字段,导致整个库挂了。alter table 语句里面设定等待时间。

两阶段锁:两阶段锁协议

如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

死锁和死锁检测,出现死锁以后,有两种策略:

一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout 来设置。

另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_

deadlock_detect 设置为 on,表示开启这个逻辑。死锁检测要耗费大量的 CPU 资源。会导致由热点行更新导致的性能问题。

事物的隔离

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。

如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。

第一种启动方式,一致性视图是在第执行第一个快照读语句时创建的;

第二种启动方式,一致性视图是在执行 start transaction with consistent snapshot时创建的。

在 MySQL 里,有两个“视图”的概念:

一个是 view。它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 cre

ate view … ,而它的查询方法与表一样。

另一个是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 (Read Committed,读提交RR(Repeatable Read,可重复读)隔离级别的实现。

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnnoDB 的事务系统申请的,是按申请顺序严格递增的。

数据表中的一行记录,其实可能有多个版本 (row),每个版本有自己的 row trx_id。

一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:

1. 版本未提交,不可见;

2. 版本已提交,但是是在视图创建后提交的,不可见;

3. 版本已提交,而且是在视图创建前提交的,可见。

更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读(current read)。

 

对于可重复读,查询只承认在事务启动前就已经提交完成的数据;

对于读提交,查询只承认在语句启动前就已经提交完成的数据;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值