数据库事务学习回顾
事务
谈到事务就一定要想到ACID:
- A:原子性
- C:一致性
- I :隔离性
- D:持久性
原子性
原子性就是指一个事务是一个操作的最小单位,所以就要满足,要么这个事务的语句全部都执行,要么全部都不执行。假如一个事务执行到一般断电,那么如果没提交的话就回滚,变成事务未执行状态,如果已经提交了,就把没有做完的事情做完,变成事务执行结束状态。
总结为一句话:要么都执行,要么不执行。
一致性
一致性就是指一个事务在它执行的前后数据的完整性或者说是有效性是一致的。参考了别人的帖子,也有说是数据库的完整性约束没有被破坏,但是感觉不是很理解。但是给出了这样一个例子:就是在银行转账的前后钱的总额不变:转账之前你是1000,对方是1000;转账之后,你是500,对方是1500。这样就保证了总额都是2000。
总结为一句话:事务前后,总体一致
隔离性
隔离性则是指有多个事务处理时,不同事务之间不会相互影响,简言之,每一个事务都是被隔离的。这个应该挺好理解的。事务对外隔离,事务的内部过程对外保密。就是B向A转账,A又向C转账,两个人同时操作,最后的结果不会有问题。
总结为一句话:事务内部数据对外隔离
持久性
持久性就是数据数据一旦被提交就无法被回滚了。也就是数据提交之前,如果出错就可以回滚,但是一旦数据提交了也就是正确执行完毕了,就把当前这个点作为最后的当前数据,回滚只能滚到这,不能往前滚了。相当于打游戏的存档点,一旦你存档了,再死亡就只能回到这个存档点,而不会回到更之前的存档点了。
总结为一句话:提交点即回滚终止点
事务读取问题
在事务处理过程中,如果是单事务执行的话,通常不会出现问题。但是一旦涉及到多事务并发状态,也就是说同时有多个事务执行的时候很有可能就会出现问题。而常见的问题有这么三种:脏读,不可重复读,幻读(也叫虚读)
脏读(读取了未提交事务的数据):
脏读就是A事务运行到一半尚未提交的时候,B事务也来操作这个数据的时候把这个未提交的数据拿去用了。这个时候如果A事务发生错误,进行回滚,那么B拿到的数据就是有问题的,其执行结果就也是有问题的。这就是脏读。
拿别人帖子的图来解释一下:
在存取款的过程中常常会出现:
不可重复读(两次读取,数据不一致):
就是在A事务对数据进行两次查询的前后出现了数据不一致的现象,也就是说是B事务在两次查询前后修改了数据。
同样,借助大佬的图来解释一下:
幻读(两次读取,数据总量不一致):
就是说,在两次查询数据的过程中,第一次查到m条,但是第二次却查到n条,总数对不上。
借大佬图:
幻读和不可重复读的区别:
幻读和不可重复读都是两次读取,但是幻读是数据的总量前后不对,而不可重复读则是同一个数据的前后不对。
以上的图均来自以下声明的博主:博主对这三种问题的解释十分清晰,希望大家能去看看!
这里只是我给自己的一个总结,可能理解不是很到位,有错误的话希望读者能够纠正。
版权声明:本文为CSDN博主「SunAlwaysOnline」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33591903/article/details/81672260