MYSQL 事务以及锁(一)

2019-10-26  本文已影响0人  NealLemon

学习笔记是学习了 极客时间 - 《MySQL实战45讲》整理的笔记。

事务隔离

事务的隔离性

事务的隔离级别

MYSQL设置其隔离级别的参数是 transaction-isolation

mysql> show variables like 'transaction_isolation';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+

实例讲解

两个事务对同一条数据进行操作。

transaction1.png

根据不同的事务级别,得到的V1,V2,V3的结果也不同。

内部逻辑

执行事务时,数据库会创建一个视图,访问的时候以视图的逻辑结果为准。

隔离实现(回滚日志)

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

多事务下的日志

假设一个值从 1 被按顺序改成了 2、3、4,在查询这条记录的时候,不同时刻启动的事务会有不同的 read-view,在回滚日志里面就会有类似下面的记录。

transaction2.png

如图中看到的,在视图 A、B、C 里面,这一个记录的值分别是 1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view A,要得到 1,就必须将当前值依次执行图中所有的回滚操作得到。

删除日志

当没有事务再需要用到这些回滚日志时(当系统里没有比这个回滚日志更早的 read-view 的时候),回滚日志会被删除。

长事务

避免长事务的几个基本配置

MYSQL中的锁

全局锁

定义

MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后的语句都会被阻塞(增删改操作,建表,修改表等)。

使用场景

全库逻辑备份

表级锁

表锁

语法
lock tables … read/write
#lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。
#如果在某个线程 A 中执行 lock tables t1 read, t2 write; 这个语句,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能访问其他表。

可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。

元数据锁(MDL)

MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写的正确性。事务中的 MDL 锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

注意的问题

transaction3.png

尽管读锁不会阻塞,但是写锁之后的读锁,必须等待写锁释放后,才可以进行。

如果某个表上的查询语句频繁,而且客户端有重试机制,也就是说超时后会再起一个新session 再请求的话,这个库的线程很快就会爆满。

行锁(InnoDB引擎)

定义

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

在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。

业务中的行锁优化

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

死锁和死锁检测

当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。

举例

事务 A 在等待事务 B 释放 id=2 的行锁,而事务 B 在等待事务 A 释放 id=1 的行锁。 事务 A 和事务 B 在互相等待对方的资源释放,就是进入了死锁状态。

transaction4.png

两种解决策略

上一篇下一篇

猜你喜欢

热点阅读