《MySQL 实战 45 讲》 学习笔记 day3

126 阅读1分钟

大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。今天和大家一起学习 MySQL😊

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

事务开启时机

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令

两阶段锁

在 InnoDB 事务里,行锁是在需要的时候加上,然后要等到事务结束的时候才会释放,这个就是两阶段锁协议

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

死锁

当并发系统里不同线程出现循环资源依赖时,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,这就是死锁。出现死锁之后,有两种策略:

  1. 直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。这个参数的默认值为 50s
  2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务能够继续执行,将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑

此文章为3月Day3学习笔记,内容来源于极客时间《MySQL 实战 45 讲》