问题描述
我想了解事务在 sql 中是如何工作的,特别是在 Postgresql 中
假设我有一个非常大的表 (first_table),下面的查询持续 2 秒,我通过 psql 执行下面的查询。
sudo -u postgres psql -f database/query.sql
这是查询:
TruncATE TABLE second_table;
INSERT INTO second_table (
foo1,foo2
)
SELECT foo1,foo2
FROM first_table;
如果我在执行前一个查询的同时执行另一个从 second_table 中选择的查询会发生什么。注意上一个查询开始处的截断表。
示例:
SELECT * FROM second_table;
编辑:我的意思是我会在第二个查询中得到零或非零记录?
解决方法
我的意思是我会在第二个查询中得到零或非零记录?
在合理的事务隔离级别下,数据库不允许脏读,这意味着没有事务可以看到尚未提交的其他事务的更改。 (在 Postgresql 中,它甚至不是关闭它的选项,在我的书中这是一个非常明智的选择)。
这意味着第二个查询要么在 TRUNCATE 之前看到表的内容,要么在 TRUNCATE 之后看到添加的新记录。但是它不会看到介于两者之间的东西,即它不会得到一个空表(假设在 TRUNCATE 之前表中有记录)并且它不会看到新记录的不完整一半(甚至是奇怪的组合)。
如果您说第二个查询在第一个查询提交之前返回,那么它会在应用第一个查询的任何更改之前看到表的状态。