type
status
date
slug
summary
tags
category
icon
password

1. 事务的特性

  • 原子性(Atomicity)———通过undolog(回滚日志)来保证的
    • 一个事务中的所有操作,要么全部完成,要么全部不完成
       
  • 一致性(Consistency)———通过持久性+原子性+隔离性来保证
    • 是指事务操作前后,是从一个稳定状态到另一个稳定状态,数据库保持一致性的状态
       
  • 隔离性(Isolation)———通过 MVCC(多版本并发控制)或锁机制来保证的
    • 多个并发事务同时操作数据,多个事务间不相互影响
       
  • 持久性(Durability)———通过 redolog(重做日志)来保证的
    • 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
 

2. 并发事务会引发的问题

  • MySQL服务端是允许多个客户端连接的,这意味着 MySQL 会出现同时处理多个事务的情况。
  • 那么在同时处理多个事务的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatableread)、幻读(phantom read)的问题。
 
  • 脏读(dirty read)
    • 【事务A读取到事务B修改但未提交的数据】
  • 不可重复读(non-repeatableread)
    • 【事务A,先后两次读取的数据不一致
  • 幻读(phantom read)
    • 【事务A,两次读取的数据的条数不一致
 

3. 事务的隔离级别

前面我们提到,当多个事务并发执行时可能会遇到「脏读、不可重复读、幻读」的现象,这些现象会对事务的一致性产生不同程序的影响。
  • 这三个现象的严重性排序如下:
    • notion image
  • SQL 标准提出了四种隔离级别来规避这些现象,隔离级别越高,性能效率就越低,这四个隔离级别如下(隔离水平从高到低):
    • notion image
  • 隔离级别
    • 读未提交(read uncommitted):指一个事务还没提交时,它做的变更就能被其他事务看到;
    •  
    • 读已提交(read committed):指一个事务提交之后,它做的变更才能被其他事务看到;
    •  
    • 可重复读(repeatable read):指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;MVCC版本控制实现。
    •  
    • 串行化(serializable);会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
 
docker总结粗略了解MySQL锁
Loading...
ZhouZhou
ZhouZhou
一个普通的打工人👨‍💼
公告
🎉ZhouZhou的博客已上线🎉
👏👏欢迎体验👏👏