事物特性及隔离在前面的文章中有介绍,不了解可以往前翻开看下。
MySQL
mysql默认的事务处理级别是’REPEATABLE-READ’,也就是可重复读
Oracle
oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。
默认系统事务隔离级别是READ COMMITTED,也就是读已提交
重点说明下可重复读、读已提交的区别:
读已提交:
假设数据库里有一个用户表,其中两天用户性别为男。
1、事物A读取性别为男的记录,此时读到两条记录,未提交事物
2、事物B将其中一条性别为男的记录修改,提交事物
3、事物A再次读取性别为男的记录,此时读到一条记录
可重复读
1、事物A读取性别为男的记录,此时读到两条记录,未提交事物
2、事物B将其中一条性别为男的记录修改,提交事物
3、事物A再次读取性别为男的记录,此时读到两条记录
综上所述:两者重要的区别,可重复读在一个事物提交前,不管其他事物对读取的内容怎么修改,多次读取的内容是一致的。相当于在一次读取的时候把读取到的数据做了一个备份,以后这个事物再执行相同的sql直接去备份里拿,不再读取数据库最新已提交的记录。 而读已提交,则在当前事物提交前,如果其他事物对读取的内容做了修改,则在当前事物中每次读取的内容都是commit到表里的最新内容。
最近对读已提交、可重复读有了点新的理解,在此做下补充:
读已提交:事物A读取记录后,事物B对A读取的记录update或insert新的数据,然后事物B提交事物。A再次读取,在一个事物中都会看到不一样的结果,update 会造成不可重复读(发下原来读取的数据内容变了,记录数量没变),insert会造成幻读(发下读取到的记录数量变了)。所以大多数数据库默认隔离级别会导致不可重复读和幻读。
可重复读:事物A读取事物后,已经在事物中对读取到内容做了备份。所以事物B对读取到的内容update操作,对事物A无影响。但是如果事物Binsert新记录,由于只备份了A之前读取的内容,新的记录增加,导致A再次读取时会出现幻读(记录增加)。所以mysql的默认隔离级别可以解决不可重复读,但是仍然会有幻读的问题。