Postgresql手册事务隔离级别笔记

postgresql提供两种事务的隔离级别,read committed和Serializable,read committed在一次事务中

的每次操作总是使用新的快照,所以事务中的操作每次看到的结果可能不一样,Serializable事务中每次操作

使用相同的快照,所以事务中看到的结果是一样的.(快照是执行事务时第一次操作时产生的)

对于处于read committed下的事务类似select xxx from xxx后执行修改操作,这种情况下两者看到的结

果可能不一样,可以用以下两种方法解决.

1. 使用 select xxx from xxx for share,这样被选中的行将不会被修改到了( 这里被选中行添加row share 锁).

2. 可以直接执行update xxx set xxx=xxx where 加具体的条件,这里在真正的修改发生时如果发现要修改

对象已经被修改将会再次计算where的条件是否满足,满足了后才会修改.但是这要满足一定的业务需求,如下

面的需求:website是个有两行数据表。website.hits分别为910

BEGIN;
UPDATE website SET hits = hits + 1;
-- run from another session:  DELETE FROM website WHERE hits = 10;
COMMIT;
本意如果是想删除hits=10的行,这里就可能出错,遇上这种情况推荐使用1的语句.当然也可以使用Serializable

的隔离级别处理,不过这时如果website满足要求的行是被修改过的,将会报错

ERROR:  could not serialize access due to concurrent update
只能重启事务了

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...