我有表“交易”,在客户帐户交易将举行。所以我想设置交易级别序列化,以防止所有类型的异常。
让我们假设交易是这样进行的:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO transaction_test (sum, currency) VALUES (333, '820');
字符串
我怀疑这个表是否可以供用户读取,因为我们的应用程序需要从这个表中运行多个SELECT来进行统计?
在Google搜索之后,我有点困惑:
- 从一方面来说,Postgres PostgreSQL actually treats every SQL statement as being executed within a transaction.,所以对数据的常规SELECT查询可能会被阻止
- 从另一方面说,“读者永远不会阻止作家”和“作家永远不会阻止读者。”由于Postgres MVCC。
**所以问题是:*Transaction表是否可以安全地用于SELECT查询,而不是与SERIAL级别隔离的事务一起更改?
1条答案
按热度按时间2jcobegt1#
PostgreSQL并不通过锁定每个潜在冲突的事务来保证
SERIALIZABLE
。相反,它采用特殊的 * predicate 锁 *,它不会阻止任何东西,但会跟踪事务读取的数据。如果出现可能违反可串行化性的情况,PostgreSQL将以 * 串行化错误 * 中止其中一个事务。不会阻塞并发的只读事务。根据文档的建议,您应该将只读查询 Package 在
SERIALIZABLE READ ONLY
事务中以获得最佳性能。