PostgreSQL 事务隔离级别
隔离级别定义
SQL标准定义了四种隔离级别。最严格的是可序列化,其中说到一组可序列化事务的任意并发执行被保证效果和以某种顺序一个一个执行这些事务一样。其他三种级别使用并发事务之间交互产生的现象来定义。
在各个级别上被禁止出现的现象是:
脏读:
一个事务读取了另一个并行未提交事务写入的数据。
不可重复读:
一个事务重新读取之前读取过的数据,发现该数据已经被另一个事务(在初始读之后提交)修改。不可重复读真正含义应该包含虚读和幻读。所谓的虚读,也就是大家经常说的不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。