首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql是否支持每个连接的不同事务隔离?

Postgresql是否支持每个连接的不同事务隔离?
EN

Database Administration用户
提问于 2014-09-14 06:41:44
回答 2查看 3.2K关注 0票数 3

我刚发现H2不支持使用不同事务隔离级别的并发连接。也就是说,更改一个连接的事务隔离会影响所有其他连接。

Postgresql是否支持对每个连接使用不同的隔离级别?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2014-09-14 19:00:59

是的,它确实支持每个连接不同的事务隔离级别。您可以为与SET SESSION CHARACTERISTICS的连接设置事务隔离级别(以及事务的只读和可延迟状态):

代码语言:javascript
复制
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启动事务时覆盖:

代码语言:javascript
复制
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参数:

代码语言:javascript
复制
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的文档

票数 4
EN

Database Administration用户

发布于 2014-09-14 13:04:43

每个事务基础设置事务隔离级别。即使是一个连接也可以在每个事务上具有不同的隔离级别。

当然,不同的连接可以有不同的隔离级别。

下面是一些测试:

代码语言:javascript
复制
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)

同时在另一届会议上:

代码语言:javascript
复制
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上设置的默认隔离级别:

代码语言:javascript
复制
#default_transaction_isolation = 'read committed'

我在Postgres 9.1上试过这个。

希望能帮上忙,干杯。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/76493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档