zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL 事务隔离

mysql事务 隔离
2023-09-14 09:14:49 时间

ACID : 原子(Atomicity)、一致(Consistency)、隔离(Isolation)、永久(Durability)

  • 多个事务可能出现问题 : 脏读 (dirty read) , 不可重复读 (non-repeatable read) , 幻读 (phantom read)

事务隔离级别 :

  • 读未提交 (read uncommitted) : 事务没提交时,做的变更能被其他事务看到
  • 读提交 (read committed) : 事务提交后,做的变更被其他事务看到
  • 可重复读 (repeatable read) : 与事务启动时 ,看到的数据一致
  • 串行化 (serializable) : 对同一行记录 , 进行读写锁。当读写锁冲突时,后访问的事务要等前个事务执行完成,才能继续执行

隔离级别例子 :

  • 读未提交 : V1 = 2 : 事务 B 还没有提交,但能被 A 看到。V2、V3 = 2
  • 读提交 : V1 = 1,V2 = 2。事务 B 提交后才能被 A看到。 V3 = 2
  • 可重复读 : V1、V2 = 1 : 事务中看到的数据都是一致的。V3 = 2
  • 串行化 : 在事务 B 执行 将 1 改成 2时锁住。直到事务 A 提交后,事务 B 才能执行。V1、V2 =1,V3 = 2

在这里插入图片描述

查看隔离级别 :

show variables like 'transaction_isolation';


+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+

事务隔离实现

每条记录在更新时 , 都会记录一条回滚操作

  • 记录上的最新值,通过回滚操作,都能得到前一个状态的值
  • 数据库的多版本并发控制 (MVCC) : 同一条记录在系统中能存在多个版本
  • 当没有事务用到这些回滚日志时 (没有比该回滚日志更早的 read-view ),回滚日志会被删除

在这里插入图片描述

事务的启动

事务启动方式 :

  • 显式启动事务 : beginstart transaction, 提交 : commit , 回滚 : rollback
  • set autocommit=0: 将该线程的自动提交关掉。该事务只有主动执行 commitrollback 或断开连接 才结束

注意点 :

  • 建议用 set autocommit=1, 通过显式启动事务 , 避免意外的长事务
  • 当连续开启事务用 commit work and chain (提交事务并自动启动下个事务) : 省了再次执行 begin 的开销

查询长事务 :

select * 
from information_schema.innodb_trx 
where TIME_TO_SEC(timediff(now(), trx_started)) > 60