postgresql的事务隔离

事务是数据库系统执行过程中最小的逻辑单位

事务特性:原子性、一致性、隔离性、持久性

非预期现象:脏读,不可重复读,幻读,序列化异常

  • 脏读:一个事务读取了第二个事务中已修改,但还未提交的数据,当第二个事务不提交并执行rollback,则出现脏读现象
  • 不可重复读:当一个事务第一次读取数据之后,被读取的数据被另一个已提交的事务进行了修改,事务再次读取这些数据的时候,出现两次查询结果不一致
  • 幻读:指一个事务的两次查询的结果集记录数不一致
  • 序列化异常:成功提交的一组事务的执行结果与这些事务按照串行执行方式的执行结果不一致

事务隔离级别:

  • 读未提交(read uncommitted):所有事务都可以看到其他未提交事务的执行结果,会出现大量的脏读
  • 读已提交(read committed):只能看见已经提交事务对关联数据所做的改变的隔离需求
  • 可重复读(repeatable read):确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
  • 可序列化(serializable):最高的隔离事务级别,通过强制事务排序,使之不可能相互冲突
隔离级别 脏读 不可重复读 幻读 序列化异常
read uncommitted 可能 可能 可能 可能
read committed 不可能 可能 可能 可能
repeatable read 不可能 不可能 可能 可能
serializable 不可能 不可能 不可能 不可能
  • postgresql内部将read uncommitted设计成和read committed一样,因此在postgresql数据库中的无论如何都无法产生脏读现象
  • postgresql默认事务隔离机制是read committed
  • 隔离级别越高,越能保证数据的完整性和一致性,但是需要更多的系统资源,增加了事务阻塞其他事务的概率,对并发性能的影响也越大,吞吐量也会更低
  • 结合程序的悲观锁和乐观锁来控制不可重复读、幻读和丢失更新的并发问题

##查看隔离事务设置
select name,setting from pg_setting where name=‘default_transaction_isolation’;

select current_setting(‘default_transaction_isolation’);

##修改全局的事务隔离级别
alter system set default_transaction_isolation to ‘repeatable read’;
select pg_reload_conf();

##查看当前会话的事务隔离级别
show transaction_isolation;

select current_setting(‘default_transaction_isolation’);

##设置当前会话的事务隔离级别
set session characteristics as transaction isolation level read uncommitted;

##设置当前事务的事务隔离级别
start transaction isolation level read uncommitted;
start transaction

end;
commit

或者
begin isolation level read uncommitted read write;

end/commit/rollback;

Guess you like

Origin blog.csdn.net/weixin_44375561/article/details/121293194