「浅谈MySQL事务」
来自 gpt 的摘要: MySQL 提供了四种隔离级别,用于控制并发事务之间的数据可见性:READ-UNCOMMITTED 允许读取未提交的变更,可能导致脏读、不可重复读和幻读;READ-COMMITTED 仅能读取已提交的数据,避免脏读,但仍无法避免不可重复读和幻读;REPEATABLE-READ 确保同一事务中的多次读取结果一致,防止脏读和不可重复读,但幻读仍可能发生;SERIALIZABLE 是最高级别的隔离,所有事务串行执行,完全避免脏读、不可重复读和幻读,但性能较低。MySQL 默认采用 REPEATABLE-READ,在大多数情况下可以避免幻读,无需使用性能开销更大的串行化隔离级别。 这些隔离级别的实现依赖于 锁机制 和 MVCC(多版本并发控制)。高隔离级别如 SERIALIZABLE 主要依靠锁来控制并发,而 READ-COMMITTED 和 REPEATABLE-READ 通过 MVCC 实现。此外,REPEATABLE-READ 在当前读情况下需要使用锁来避免幻读。 MySQL 的事务确保数据库操作构成一个逻辑整体,符合 ACID 特性:原子性 保证事务内的操作不可分割;一致性 确保数据在事务前后保持一致;隔离性 使并发事务互不干扰;持久性 确保已提交的事务在故障后仍然有效。InnoDB 存储引擎通过 redo log 实现持久性,undo log 确保原子性,MVCC 和锁机制 实现隔离性,而一致性依赖其他三者的共同保障。
Mysql 隔离机制有哪些 ?
- READ UNCOMMITTED(读未提交)
这是最低的隔离级别。在这个级别下,一个事务可以读取另一个未提交事务的修改。这可能导致脏读、不可重复读和幻读。
实现:无需额外的机制,直接读取数据即可。
- READ COMMITTED(读已提交)
大多数数据库系统的默认隔离级别(但不是 MySQL 的默认级别)。它只能读取已经提交的数据。这可以防止脏读,但仍然可能导致不可重复读和幻读。
实现:当事务进行时,它读取的数据行会被加上锁,其他事务不能修改这些数据行,直到当前事务提交或回滚。
- REPEATABLE READ(可重复读)
MySQL 的默认隔离级别。它确保了在同一个事务中多次读取同样记录的结果是一致的。这可以防止脏读和不可重复读,但仍然可能导致幻读。
实现:MySQL 使用多版本并发控制(MVCC)来实现这个隔离级别。每个事务都看到一个一致的数据快照,即使其他事务正在修改数据。
- SERIALIZABLE(可串行化)
这是最高的隔离级别。它通过强制事务串行执行,从而避免脏读、不可重复读和幻读。但是,这可能会大大降低并发性能。
实现:在 SERIALIZABLE 级别下,每个读写事务都会获得一个唯一的锁,这确保了事务的串行执行。MySQL 通过表锁或行锁来实现这一点,具体取决于存储引擎。
MySQL 在「可重复读」隔离级别下,可以很大程度上避免幻读现象的发生(注意是很大程度避免,并不是彻底避免),所以 MySQL 并不会使用「串行化」隔离级别来避免幻读现象的发生,因为使用「串行化」隔离级别会影响性能。
Mysql 隔离机制怎么实现的 ?
MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。
SERIALIZABLE 隔离级别是通过锁来实现的,READ-COMMITTED 和 REPEATABLE-READ 隔离级别是基于 MVCC 实现的。不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。
数据库事务了解吗 ?
数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 。
数据库事务的特性 ?
ACID 特性:
原子性(
Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性(
Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;隔离性(
Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性(
Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!
InnoDB 引擎通过什么技术来保证事务的这四个特性?
持久性是通过 redo log (重做日志)来保证的;
原子性是通过 undo log(回滚日志) 来保证的;
隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
一致性则是通过持久性+原子性+隔离性来保证;
