一句话讲清楚数据库中事务的隔离级别(通俗易懂版)
为什么我只说通俗易懂版不说严谨版?
因为严谨版遍地都是, 但是他们却有一个缺点就是让人看得云里雾里, 所以这就是我写通俗易懂版的初衷!
但是既然是通俗易懂版就必然有缺陷, 只为了各位在开发过程中头脑更加清晰, 如有错误还望兄弟们不吝赐教!
在MySQL数据库中,事务一共有4中隔离级别,它们分别是:
1. 读未提交: 就是在一个事务中, 可以查询到其他事务中执行了update或者insert却没有执行commit语句的数据,所以会产生脏读,幻读,不可重复读的问题(稍后再解释)
2. 读已提交(oracle和sqlServer默认的隔离级别): 就是在一个事务中, 不能查询到其他事务中执行了update却没有执行commit语句的数据了,但是commit后,就能查询到了,这个级别解决了脏读的问题
3. 可重复读(mysql默认的隔离级别): 可以理解为当一个事务开始时, 对整个数据库进行了一次快照,你接下来的所有查询都只能查询到快照中的数据,即使可能这个数据已经被其他事务修改了一千次一万次你也不会知道,插入或者删除多少数据也同理与你本次事务无关
4. 串行化: 可以理解为 如果有多个事务同时访问同一个数据库, 即使他们要操作的表毫无关联, 也要排队一个个等上一个事务commit,从根本上避免了各种问题,但是效率极低
脏读: 我查询到了其他事务中update了但还未commit的数据
幻读: 我使用相同条件查询多次, 结果集可能由于其他已经commit的事务进行了新增或者删除操作导致数据量发生了变化
不可重复读: 我使用相同条件查询多次, 结果集可能由于其他已经commit的事务进行了update操作导致数据内容发生了变化