-- 查询当前事务级别 SELECTname, setting FROM pg_settings WHEREname ='default_transaction_isolation'; -- 设置当前事务为 SELECT current_setting('default_transaction_isolation'); SELECTname, setting FROM pg_settings WHEREname ='transaction_isolation'; SELECT current_setting('transaction_isolation');
常见异常概念
脏读(数目不变、修改+回滚 数据值变化)
脏读主要针对RU事务级别的数据更新Update操作出现的问题
当事务等级是读未提交RU时:
T1: update、rollback
T2: select x 2
1. T1修改了没提交
1. T2读了T1的修改值
1. T1回滚修改
1. T2读到的值就是脏值
1 2 3 4 5 6
sequenceDiagram T1->>中间态: update t1 set name = 'lisi' where id = 1 Note right of T1: 将id=1的name从zhangsan变更成lisi T2->>中间态: select name from t1 where id = 1 中间态-->>T1: rollback; T2->>中间态: id=1的name可能不等于zhangsan,这时候就是读到了脏数据
不可重复度(数目不变,修改+提交 数据值变化)
不可重复度主要针对RU、RC事务级别下进行数据更新与多次读取之间结果值不同的问题
T1: select x 2
T2: update
T1读取
T2修改
T2提交
T1又读了一次,发现两次结果竟然不一样;
1 2 3 4 5 6 7
sequenceDiagram T1->>中间态: select name from t1 where id = 1 Note right of T1: name = zhangsan T2->>中间态: update t1 set name = 'lisi' where id = 1 T1->>中间态: select name from t1 where id = 1 Note right of T1: T1第一次select的name是zhangsan 第二次select的却变成了lisi Note right of T1: 明明T1只是做了两次查询 两次却读到了不一样的值
幻读(数目变化, 创建或删除,数据值可能变化)
T1: select x 2
T2: insertdelete
T1读取了满足某一搜索条件的数据集合,T2创建或删除了满足该搜索条件的数据项并提交了。
T1再次使用同样的搜索条件查询的时候,发现和第一次查询的结果不同;
1 2 3 4 5 6
sequenceDiagram T1->>中间态: select name from t1 where id < 10; T2->>中间态: delete from t1 where id < 10/insert into t1 values (xxx); T1->>中间态: select name from t1 where id < 10; Note right of T1: T1发现查不到数据了 Note right of T1: 明明T1只是做了两次查询 两次却发生了数据量上的幻觉
ERROR: could not serialize access due to concurrent update