Mysql事务的特性和隔离级别
1、事务的定义是什么
一组操作要么全部成功,要么全部失败。对 MySQL:就是一组 SQ L要么全部成功执行,要么全都不执行 (或失败回滚)。
2、事务的四大特性是什么
分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。通常称为事务的 ACID 四大特性。
接下来分别解释下各个特性的含义:
(1)原子性
一个事务被视为一个不可分割的最小单元,这个事务中的操作要么都成功,要么都失败,不能只是执行其中的一部分。
比如: A 要给 B 转钱,A 扣除 100 元 ,B 必须也增加 100 元
(2)一致性
事务开始前和结束后数据库中数据的完整性没有被破坏,只是从一种一致性状态转换到另一种一致性的状态。
比如:A 和 B 加起来有 100 元钱,无论 A 和 B 如何转账,A 和 B 的钱加起来永远都是 100 元
(3)隔离性
并发执行的各事务之间不能互相干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。
(4)持久性
事务一旦提交,那么它所做的修改就会永久保存到数据库中。即使此时系统崩溃,已经提交的修改数据也不会因此丢失。
3、事务并发带来的问题是什么
我们都知道 MySQL 是个客户端/服务器架构组件,对于服务器来说,可能同时在处理多个事务。
上面讨论的事务特性中的隔离性,理论上某个事务对数据进行访问时,其他事务应该排队,当该事务提交后,其他事务才可以继续访问该数据,不过此时并发事务的执行就变成了串行化执行。此时性能就会大打折扣。
我们的目标其实是既需要保持事务一定的隔离性,又需要让服务器在处理多事务并发时性能尽量高。
如果我们不考虑隔离性,可能会带来什么样的数据问题呢?
(1)脏读
事务 A 读取到了事务 B 已经修改但还没有提交的数据
(2)不可重复读
同一个事务中,两次查询同一行数据时返回不同的结果。强调现有行的 update 或 delete
(3)幻读
同一个事务中,两次查询同一范围内的数据时,第二次查询的结果集包含了之前不存在的新行或缺少了某些行。强调新行的 insert 或现有行的 delete
4、事务的四个隔离级别是什么
为解决事务并发带来的上述问题,MySQL 提出事务隔离级别,不同的事务隔离级别可以解决不同的问题。总结如下:
各隔离级别的详细说明如下:
读未提交(RU)
特点:允许读取尚未提交的数据
优点:提供最高的并发性能
缺点:可能导致脏读、不可重复读和幻读,不适合大多数实际应用
读已提交(RC)
特点:只能读取已经提交的数据
优点:避免脏读,提供了较好的并发性能
缺点:仍可能发生不可重复读和幻读
可重复读(RR)
特点:在事务期间,保证多次读取同一行数据的结果一致
优点:避免脏读和不可重复读,适合大多数应用场景
缺点:可能发生幻读,特别是在范围查询时
串行化(Serializable)
特点:最高的隔离级别,确保事务按照某种顺序依次执行
优点:完全避免脏读、不可重复读和幻读问题,提供最严格的一致性保证
缺点:可能显著降低并发度,影响系统性能
5、实际应用如何选择事务的隔离级别
见仁见智,没有最好的,只有更适合的。
需要根据实际业务需求和技术约束等情况来选择合适的隔离级别。
例如:
金融系统场景:为确保数据的一致性及准确性,通常选择 Serializable 或 Repeatable Read 级别
电商网站场景:考虑到电商场景的高并发需求,可能会选择 Read Committed 级别旨在取得性能和一致性之间的平衡
日志记录或统计分析场景:数据一致性可能要求不高,可选择 Read Uncommitted 来提高性能
大佬,点个赞在走呗!