Gili Asked: 2014-09-14 22:41:44 +0800 CST2014-09-14 22:41:44 +0800 CST 2014-09-14 22:41:44 +0800 CST Postgresql 是否支持每个连接的不同事务隔离? 772 我刚刚发现H2 不支持使用不同事务隔离级别的并发连接。这意味着,更改一个连接的事务隔离会影响所有其他连接。 Postgresql 是否支持对每个连接使用不同的隔离级别? postgresql jdbc 2 个回答 Voted Best Answer hbn 2014-09-15T11:00:59+08:002014-09-15T11:00:59+08:00 是的,它确实支持每个连接的不同事务隔离级别。您可以为以下连接设置事务隔离级别(以及事务的只读和可延迟状态)SET SESSION CHARACTERISTICS: localhost:5432 postgres postgres # SHOW transaction_isolation; transaction_isolation ----------------------- read committed (1 row) localhost:5432 postgres postgres # SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET localhost:5432 postgres postgres # SHOW transaction_isolation; transaction_isolation ----------------------- repeatable read (1 row) 您可以使用 覆盖每个事务SET TRANSACTION ISOLATION LEVEL,或者在开始事务时使用BEGIN TRANSACTION ISOLATION LEVEL: localhost:5432 postgres postgres # BEGIN; BEGIN Time: 0.227 ms localhost:5432 postgres postgres * # SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET Time: 0.229 ms localhost:5432 postgres postgres * # SHOW transaction_isolation; transaction_isolation ----------------------- serializable (1 row) Time: 0.262 ms localhost:5432 postgres postgres * # COMMIT; COMMIT localhost:5432 postgres postgres # SHOW transaction_isolation; transaction_isolation ----------------------- repeatable read (1 row) 默认使用default_transaction_isolation参数设置: localhost:5432 postgres postgres # SHOW default_transaction_isolation; default_transaction_isolation ------------------------------- repeatable read (1 row) 请参阅http://www.postgresql.org/docs/current/static/sql-set-transaction.html上的文档 Soni Harriz 2014-09-15T05:04:43+08:002014-09-15T05:04:43+08:00 事务隔离级别是按事务设置的。即使是一个连接也可以在每个事务上具有不同的隔离级别。 当然不同的连接可以有不同的隔离级别。 这是一些测试: postgres=# begin; BEGIN postgres=# show transaction_isolation ; transaction_isolation ----------------------- read committed (1 row) postgres=# set transaction isolation level serializable ; SET postgres=# show transaction_isolation ; transaction_isolation ----------------------- serializable (1 row) 同时在另一个会话上: postgres=# begin; BEGIN postgres=# show transaction_isolation ; transaction_isolation ----------------------- read committed (1 row) postgres=# set transaction isolation level read uncommitted ; SET postgres=# show transaction_isolation ; transaction_isolation ----------------------- read uncommitted (1 row) 一旦您提交一个事务并开始另一个新事务,将使用在 postgresql.conf 上设置的默认隔离级别: #default_transaction_isolation = 'read committed' 我在 Postgres 9.1 上试试这个。 希望对你有所帮助,加油。
是的,它确实支持每个连接的不同事务隔离级别。您可以为以下连接设置事务隔离级别(以及事务的只读和可延迟状态)
SET SESSION CHARACTERISTICS
:您可以使用 覆盖每个事务
SET TRANSACTION ISOLATION LEVEL
,或者在开始事务时使用BEGIN TRANSACTION ISOLATION LEVEL
:默认使用
default_transaction_isolation
参数设置:请参阅http://www.postgresql.org/docs/current/static/sql-set-transaction.html上的文档
事务隔离级别是按事务设置的。即使是一个连接也可以在每个事务上具有不同的隔离级别。
当然不同的连接可以有不同的隔离级别。
这是一些测试:
同时在另一个会话上:
一旦您提交一个事务并开始另一个新事务,将使用在 postgresql.conf 上设置的默认隔离级别:
我在 Postgres 9.1 上试试这个。
希望对你有所帮助,加油。