Postgres中的脏读

时间:2009-07-22 13:54:34

标签: postgresql

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

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


SET SESSION CHARACTERISTICS AS SERIALIZABLE;

SELECT * FROM MyTable;

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

由于

2 个答案:

答案 0 :(得分:10)

PostgreSQL没有实现从函数外部看到这一点的方法,即READ UNCOMMITTED隔离级别。您的基本两个选项是:

  • 让函数不时使用RAISE NOTICE来向您显示您的距离
  • 从函数中使用类似dblink的东西回到同一个数据库,并从那里更新计数器表。由于这是一个完全独立的事务,一旦事务提交,计数器就会立即显示 - 您不必等待主事务(在函数调用周围)完成。

答案 1 :(得分:6)

PostgreSQL Transaction Isolation

  

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