Postgres中的脏读

Use*_*er1 6 postgresql dirtyread

我有一个长时间运行的功能,应插入新行.如何查看此功能的进度?

我认为脏读将起作用所以我阅读http://www.postgresql.org/docs/8.4/interactive/sql-set-transaction.html并提出以下代码并在新会话中运行它:


SET SESSION CHARACTERISTICS AS SERIALIZABLE;

SELECT * FROM MyTable;
Run Code Online (Sandbox Code Playgroud)

Postgres给我一个语法错误.我究竟做错了什么?如果我做对了,那么当长函数仍在运行时,我会看到插入的记录吗?

谢谢

Mag*_*der 11

PostgreSQL没有实现一种方法让你从函数外部看到这个,也就是READ UNCOMMITTED隔离级别.您的基本两个选项是:

  • 不时使用该功能RAISE NOTICE向您展示您的距离
  • 使用类似dblink的函数返回到同一个数据库,并从那里更新计数器表.由于这是一个完全独立的事务,一旦事务提交,计数器将立即可见 - 您不必等待主事务(在函数调用周围)完成.


小智 6

PostgreSQL事务隔离

在PostgreSQL中,您可以请求四个标准事务隔离级别中的任何一个.但在内部,只有两个不同的隔离级别,对应于Read Committed和Serializable级别.当您选择级别Read Uncommitted时,您确实获得了Read Committed,当您选择Repeatable Read时,您确实获得了Serializable,因此实际的隔离级别可能比您选择的更严格.这是SQL标准所允许的:四个隔离级别仅定义哪些现象不得发生,它们不定义必须发生的现象.