我们知道事务隔离级别有:读未提交,读已提交,可重复读,可序列化。
读未提交 存在 脏读,不可重复读,幻读;
读已提交 存在 不可重复读,幻读
可重复读 存在 幻读
PG 下默认为读已提交,ORACLE默认也是读已经提交,一般很少有人去关注过这个,但在pg,mysql,对这个比较热衷。
先来看看概念:
脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。 例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
幻读: 是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
我们来准备一个数据张表:
create table tt(id int);
当前事务隔离情况:
要修改隔离级别,可以使用
先来测试 读提交
1.先进入事务T1 ,T2,两边记录都一样
2.事务T1插入数据,但不提交,事务T2 看不到
3.事务T1提交,事务T2,已经能看到
测试可重复读:
1.设置隔离级别为可重复读
2. 会话1插入数据,并提交,但会话二不能看到会话一已经提交的数据
好了,测试做到这里。
为了方便交流,我建立了一个微信群:水煮数据库,主要交流日常运维中用到的数据库相关问题,包含但不限于:ORACLE,PG,MYSQL,SQLSERVER,OB,TIDB,达梦,TDSQL,OPENGAUSS,人大金仓,GBASE等等,如果有兴趣交流,可以加我微信:zq24803366, 我可以拉你入群。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cqsztech/article/details/138414459