MySql 事务的ACID与实现原理 落日映苍穹つ 2023-10-02 11:37 1阅读 0赞 数据库的事务是并发控制的基本单位,是指逻辑上的一组操作,要么全部执行,要么全部不执行。 # `一、事务的ACID:` # * (1)原子性:事务是一个不可分割的工作单元,事务里的操作要么都成功,要么都失败,如果事务执行失败,则需要进行回滚。 * (2)隔离性:事务的所操作的数据在提交之前,对其他事务的可见程度。 * (3)持久性:一旦事务提交,它对数据库中数据的改变就是永久的。 * (4)一致性:事务不能破坏数据的完整性和业务的一致性。例如在转账时,不管事务成功还是失败,双方钱的总额不变。 # `二、ACID的实现原理:` # * 原子性:原子性是通过MySQL的回滚日志undo log来实现的:当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。 * 隔离性: * (1)事务的隔离级别:为保证在并发环境下读取数据的完整性和一致性,数据库提供了四种事务隔离级别,隔离级别越高,越能保证数据的完整性和一致性,但对高并发性能影响也越大,执行效率越低。(四种隔离级别从上往下依次升高) * 读未提交:允许事务在执行过程中,读取其他事务尚未提交的数据; * 读已提交:允许事务在执行过程中读取其他事务已经提交的数据; * 可重复读(默认级别):在同一个事务内,任意时刻的查询结果都是一致的; * 读序列化:所有事务逐个依次执行,每次读都需要获取表级共享锁,读写会相互阻塞。 * (2)事务的并发问题:如果不考虑事务的隔离性,在事务并发的环境下,可能存在问题有: * 更新丢失:两个或多个事务操作相同的数据,然后基于选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题:最后的更新覆盖了其他事务所做的更新。 * 脏读:指事务A正在访问数据,并且对数据进行了修改(事务未提交),这时,事务B也使用这个数据,后来事务A撤销回滚,并把修改后的数据恢复原值,B读到的数据就与数据库中的数据不一致,即B读到的数据是脏数据。 * 不可重复读:在一个事务内,多次读取同一个数据,但是由于另一个事务在此期间对这个数据做了修改并提交,导致前后读取到的数据不一致; * 幻读:在一个事务中,先后两次进行读取相同的数据(一般是范围查询),但由于另一个事务新增或者删除了数据,导致前后两次结果不一致。 * (3)事务隔离性的实现原理:持久性的依靠redo log日志实现,在执行SQL时会保存已执行的SQL语句到一个redo log文件,但是为了提高效率,将数据写入到redo log之前,会先写入到内存中的redo log buffer缓存区中。写入过程如下:当向数据库写入数据时,执行过程会首先写入redo log buffer,redo log buffer中修改的数据会定期刷新到磁盘的redo log文件中,这一过程称为刷盘(即redo log buffer写日志到磁盘的redo log file中 )。 redo log buffer的使用可以大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时redo log buffer中修改的数据在内存还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。为了确保事务的持久性,在当事务提交时,会调用fsync接口对redo log进行刷盘 ,刷新频率由 innodb\_flush\_log\_at\_trx\_commit变量来控制的: 0:表示不刷入磁盘; 1:事务每次提交的时候,就把缓冲池中的数据刷新到磁盘中; 2:提交事务的时候,把缓冲池中的数据写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件。可能 1 秒后才会把 os cache 里的数据写入到磁盘文件里去。 不同的事务隔离级别,在并发环境会存在不同的并发问题: ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5Lmm6aaZ5rC05aKo_size_20_color_FFFFFF_t_70_g_se_x_16] * 一致性:一致性指的是事务不能破坏数据的完整性和业务的一致性 : * 数据的完整性: 实体完整性、列完整性(如字段的类型、大小、长度要符合要求)、外键约束等 * 业务的一致性:例如在银行转账时,不管事务成功还是失败,双方钱的总额不变。 [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5Lmm6aaZ5rC05aKo_size_20_color_FFFFFF_t_70_g_se_x_16]: https://img-blog.csdnimg.cn/db0bc408688e4efd9d5b090f46ff4ce7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Lmm6aaZ5rC05aKo,size_20,color_FFFFFF,t_70,g_se,x_16
还没有评论,来说两句吧...