默认情况下,PostgreSQL运行在READ COMMITTED事务隔离模式中。
下面有关于事务隔离的一个例子:
SELECT
*
FROM
t_account ;
id | currency_id | balance
----+-------------+---------
1 | 1 | 100
2 | 1 | 200
(2 rows)
事务1 | 事务 2 |
---|---|
BEGIN; | |
SELECT sum(balance) FROM t_account ; | |
返回300 | BEGIN; |
INSERT INTO t_account (balance) VALUES(100); | |
COMMIT; | |
SELECT sum(balance) FROM t_account ; | |
返回400 | |
COMMIT; |
大部分用户实际上会期望左边的事务一直返回300,因此可以使用TRANSACTION ISOLATION LEVEL REPEATABLE READ。在这种事务隔离级别中,一个事务将在整个事务期间都使用同一个快照。
事务1 | 事务 2 |
---|---|
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; | |
SELECT sum(balance) FROM t_account ; | |
返回300 | BEGIN; |
INSERT INTO t_account (balance) VALUES(100); | |
COMMIT; | |
SELECT sum(balance) FROM t_account ; | SELECT sum(balance) FROM t_account ; |
返回300 | 返回400 |
COMMIT; |
可重复读并不比读已提交更昂贵,所以不需要担心性能上受到的惩罚。
读未提交不受支持,如果用户尝试开始一个读未提交的事务,PostgreSQL会把它映射成读已提交。
在读已提交和可重复读之上,PostgreSQL还提供了可序列化(SSI)事务。