MySQL事务总结
事务的特性ACID
InnoDB 引擎支持事务,MyISAM 引擎不支持事务
事务的四个特性:
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
实现:
- 原子性:通过 undolog 来实现。
- 持久性:通过 binlog、redolog 来实现。
- 隔离性:通过(读写锁+MVCC)来实现。
- 一致性:MySQL 通过原子性、持久性、隔离性最终实现数据一致性。
对 MySQL 来说,逻辑备份日志(binlog)、重做日志(redolog)、回滚日志(undolog)、锁技术 + MVCC 就是 MySQL 实现事务的基础。
并发事务问题
问题 | 描述 |
---|---|
脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。 |
事务的隔离级别:
- 读未提交:一个事务还没提交时,它做的变更就能被其他事务看到;(脏读,不可重复读,幻读)
- 读提交:一个事务提交之后,它做的变更才能被其他事务看到;(不可重复读,幻读)
- 可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,InnoDB 引擎的默认隔离级别,(幻读)
- 串行化:会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;