事务有哪些特性?
事务是由MYSQL的引擎来实现的,并不是所有的引擎都支持事务。
常见的MYSQL引擎
InnoDB引擎
- InnoDB是MYSQL默认的事务性存储引擎,其核心优势在于对ACID事务的完整支持,这确保了再高并发的环境下数据操作的一致性,原子性,隔离性与持久性。
- InnoDB采用了行级锁定机制,能够最大程度的减少并发写入时的锁冲突,提高系统的并发处理能力。
- 此外InnoDB还支持外键约束,有助于维护数据之间的参照完整性,并通过redo log和undo log实现了可靠的崩溃恢复能力,保证数据在意外停机后的不丢失与一致性
- InnoDB 引擎内部的缓冲池 机制也能有效地缓存数据和索引,提升读写性能。因此,InnoDB 适用于有高并发、事务支持和数据完整性需求的应用场景。
MylSAM引擎
- 与 InnoDB 不同,MyISAM 是一个非事务性 的存储引擎,它不支持 ACID 事务 ,这意味着在并发写入或系统崩溃时,数据的一致性无法得到保证。它同样也不支持外键约束。
- MyISAM 采用了表级锁定 ,即当一个写操作发生时,会锁定整个表,这在高并发写入场景下会导致严重的性能瓶颈。
- MyISAM 的主要特点是其读取速度快,因为它将数据和索引分开存储,并且结构相对简单。
- 然而,由于缺乏事务支持和行级锁定 ,MyISAM 更适用于读多写少、对数据一致性要求不高的简单应用,例如一些只读的报表查询或日志记录。
Memory引擎
- Memory 引擎将所有数据存储在内存 中,因此具有极高的读写速度。
- 然而,其最大的缺点是数据的易失性,一旦 MySQL 服务器关闭或重启,存储在 Memory 引擎中的数据将会全部丢失。
- Memory 引擎支持表级锁定 ,这个引擎通常是用于创建临时表 ,或者缓存一些频繁访问且数据量不大 、对持久性要求不高的临时数据,以加速查询。
Archive引擎
- Archive 引擎主要用于存储 大量 不经常访问的归档数据。
- 它最大的特点是对数据进行高度压缩,能够显著节省存储空间。
- Archive 引擎支持高速的数据插入 ,但其查询性能非常差 ,通常只能进行全表扫描,并且不支持索引。因此,它适用于那些只需要将数据写入并长期保存,而对查询性能要求不高的场景,例如存储历史日志或传感器数据。
事务的四大特性
原子性:一个事务中的所有操作要么成功,要么失败即要么全部成功,要么全部失败。
一致性:是指事务操作前后,数据满足完整性约束,数据库保持一致性状态。
隔离性:数据库允许多个并发事务同时对其数据库进行读写和修改的能力,隔离性可以防止并发执行由于交替执行引发的数据不一致问题。
持久性:事务处理结束后对数据的修改是永久的,即便系统故障也不会丢失。
InnoDB引擎是通过什么技术来保证事务的四大特性的?
持久性通过redo log(重做日志)来保证的。
原子性是通过undo log(回滚日志)来保证的。
隔离性是通过MVCC(多版本控制并发)或锁机制来保证的。
一致性则是通过持久性+原子性+隔离性来保证的。
并发事务会引发什么问题?
脏读
定义:一个事务读到了另一个事务中未提交的数据。
例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取小林的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。

因为事务A还没有提交事务,随时可能会发生回滚操作,如果发生回滚,B读到的数据就是过期数据,这种现象被称为脏读。
不可重复读
定义:在一个事务内多次读取同一个数据,前后两次读到的数据不一样。
例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后继续执行代码逻辑处理,在这过程中如果事务 B 更新了这条数据,并提交了事务,那么当事务 A 再次读取该数据时,就会发现前后两次读到的数据是不一致的,这种现象就被称为不可重复读。

幻读
定义:在一个事务内多次查询某个记录数量,前后两次查询到的数量不一致。
例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库查询账户余额大于 100 万的记录,发现共有 5 条,然后事务 B 也按相同的搜索条件也是查询出了 5 条记录。
接下来,事务 A 插入了一条余额超过 100 万的账号,并提交了事务,此时数据库超过 100 万余额的账号个数就变为 6。
然后事务 B 再次查询账户余额大于 100 万的记录,此时查询到的记录数量有 6 条,发现和前一次读到的记录数量不一样了,就感觉发生了幻觉一样,这种现象就被称为幻读。

事务的隔离机制有哪些?
读未提交:指一个事务还没有提交时,它做的变更就能被其他事物看到。
可能出现:脏读 不可重复读 幻读
读提交:指一个事务提交后,他做的变更才能被其他事务看到。
可能出现:不可重复读 幻读
可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MYSQLInnoDB 引擎的默认隔离级别。
可能出现:幻读
串行化:会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等待前一个事务执行完成时,才能继续执行。
