数据库事务隔离级别问题及实例分析

数据库并发读取遇到的现象:

  1. 脏读: 事务T1对于数据的处理未提交,事务T2查询数据的结果,在事务T1 Rollback后数据结果回滚到T1执行数据处理前,T2查询的结果就是脏读

事务T1 数据处理执行前结果
数据库事务隔离级别问题及实例分析_第1张图片
事务T1 执行修改数据操作
数据库事务隔离级别问题及实例分析_第2张图片
此时执行事务T2,执行结果能看到新增行,一旦T1rollback, T2的查询结果就不是持久化的结果。

2.可重复读:并行事务,事务T1操作了某数据,事务T2在T1执行过程中也操作了同样的数据,就导致T1和T2看到的结果不一样。

3 .幻读:事务T1查看数据100行,事务中事务T2插入了一行,T1再次执行查询发现结果与事务开始前不一致。
数据库事务隔离级别问题及实例分析_第3张图片
在第一个sql执行的间隙,其他事务对表数据做了新增,导致一个事务相同的sql查询结果不一致,MVCC这里用到的就是gap锁来解决这一问腿。

PostgreSQL 隔离级别四种:

  1. Read uncommitted 读未提交 无法避免任何并发事务的问题
  2. Read committed 读已提交 可以解决脏读问题
  3. Repeated read 可重复读 可以解决不可重复读
  4. Serializable 串行化 可以解决全部并行问题,每次事务锁表,性能差
show default_transaction_isolation  查看数据库默认隔离级别
set transaction isolation level Read uncommitted;   设置数据库事务隔离级别

数据库事务隔离级别问题及实例分析_第4张图片
PostgreSQL默认隔离级别 read committed 读已提交

你可能感兴趣的:(数据库)