事务
事务概念
https://leetcode.cn/leetbook/read/tech-interview-cookbook/omtpjs/
事务并发性一致问题
https://leetcode.cn/leetbook/read/tech-interview-cookbook/om8ebd/
隔离级别
https://leetcode.cn/leetbook/read/tech-interview-cookbook/om3j13/
MVCC
https://leetcode.cn/leetbook/read/tech-interview-cookbook/omqy4m/
https://blog.csdn.net/SnailMann/article/details/94724197?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167690898316800188531193%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167690898316800188531193&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-94724197-null-null.142^v73^control,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=mvcc&spm=1018.2226.3001.4187
第一类丢失更新(回滚丢失)
A事务撤销时,把已经提交的B事务的更新数据覆盖了
第二类丢失更新(覆盖丢失/两次更新问题)
A事务覆盖B事务已经提交的数据
锁
https://leetcode.cn/leetbook/read/tech-interview-cookbook/om3xch/
全局锁:
MySQL 提供了⼀个加全局读锁的⽅法,命令是 Flush tables with read lock (FTWRL),加上该锁之后整个数据库只读
表锁
特点:
1. 每次操作锁住整张表
2. 开销⼩,加锁快
3. 并发度最低
表锁的语法是 lock tables … read/write。与 FTWRL 类似,可以⽤ unlock tables主动释放锁,也可以在客户端断开的时候⾃动释放。
需要注意: lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。
元数据锁
防止在读写过程中表结构被修改,访问一个表时自动加上
事务中的 MDL 锁,在语句执⾏开始时申请,但是语句结束后并不会马上释放,⽽会等到整个事务提交后再释放。(这可能会产⽣死锁的问题)
行锁
顾名思义,⾏锁就是针对数据表中⾏记录的锁(也有⼈称为记录锁)。
这很好理解,⽐如事务 A 更新了⼀⾏,⽽这时候事务 B 也要更新同⼀⾏,则必须等事务 A 的操作完成后才能进⾏更新。
特点:
- 每次操作锁住⼀⾏数据
- 开销⼤,加锁慢
- 发⽣锁冲突的概率是最低的,并发度是最⾼的
在 InnoDB 事务中,⾏锁是在需要的时候才加上的,但并不是不需要了就⽴刻释放,⽽是要等到事务结束时才释放。这个就是两阶段锁协议。
知道了这个设定,对我们使⽤事务有什么帮助呢?那就是,如果你的事务中需要锁多个⾏,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。