【学习计划】《MySQL实战45讲》03 | 事务隔离:为什么你改了我还看不见?

本文详细介绍了数据库事务的基本概念,如ACID属性和MVCC,并探讨了MySQL中的事务支持,包括InnoDB引擎和不同隔离级别的应用。重点讨论了事务隔离级别中的可重复读及其在数据校对场景中的重要性,同时提到了长事务的影响和如何查询长事务。此外,还阐述了事务的启动方式和回滚日志的管理策略。
摘要由CSDN通过智能技术生成


一、新名词

1. 事务

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。

2. ACID

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

3. MVCC(多版本并发控制)

同一条记录在系统中可以存在多个版本
MVCC


二、新指令

1. commit work and chain

提交事务并自动启动下一个事务


三、新参数

1. transaction-isolation(隔离级别)

隔离级别参数:
0 - 读未提交 (READ-UNCOMMITTED)
1 - 读已提交 (READ-COMMITTED)
2 - 可重复读 (REPEATABLE-READ)
3 - 序列化 (SERIALIZABLE)

查询当前隔离级别:

mysql> show variables like 'transaction_isolation';

设置当前隔离级别:

mysql> set transaction_isolation=1;

四、新知识点

1. MySQL 中支持事务的引擎

MySQL 中,事务支持是在引擎层实现的。InnoDB 支持事务,而 MySQL 原生的 MyISAM 引擎并不支持事务。这也是 MyISAMInnoDB 取代的重要原因之一。

2. 脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)

  1. 脏读(dirty read):指的是读到了其他事务未提交的数据
  2. 不可重复读(non-repeatable read):指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。
  3. 幻读(phantom read):指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。幻读仅专指“新插入的行”。

3. SQL 标准的事务隔离级别

SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。

  1. 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  2. 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  3. 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  4. 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

4. 什么时候需要“可重复读”的场景?

做数据校对逻辑的时候。

假设你在管理一个个人银行账户表。一个表存了账户余额,一个表存了账单明细。到了月底你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。你一定希望在校对过程中,即使有用户发生了一笔新的交易,也不影响你的校对结果。

这时候使用“可重复读”隔离级别就很方便。事务启动时的视图可以认为是静态的,不受其他事务更新的影响。

5. 回滚日志什么时候删除?

在不需要的时候才删除。系统会判断,当没有事务再需要用到这些回滚日志时,回滚日志会被删除。

6. 什么时候不需要回滚日志?

当系统里没有比这个回滚日志更早的 read-view 的时候。

7. 为什么建议尽量不要使用长事务?

长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。

除了对回滚段的影响,长事务还占用锁资源,也可能拖垮整个库。

8. 事务的启动方式

  1. 显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
  2. set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

9. 查询长事务的方法

查找持续时间超过 60s 的事务:

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值