我是数据库新手,我迷失了transaction。例如,在我有一个sensor_log
不断接收 INSERT 的表并且我想在一个事务中将数据移动到另外两个表的情况下。
BEGIN;
INSERT INTO sensor_log_a
SELECT id, location
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);
INSERT INTO sensor_log_b
SELECT id, location
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);
COMMIT;
BEGIN;..COMMIT;
如果在事务期间插入数据或阻止这种情况,sensor_log_a 和 sensor_log_b 之间是否存在数据不同的风险?
语句根据语句开始时存在的数据查看“世界”的一致视图。因此,您的两个插入语句中的语句在运行时
select
不会看到新行。但是,如果在运行这两个语句之间(或在第一个语句启动之后)更改了表,则每个 select 语句可能会看到不同的数据,例如第一个看到 100 行,第二个看到 200 行。
如果要确保整个事务看到一致的数据视图,请使用更高的隔离级别。在你的情况下使用
repeatable read
就足够了。另一种选择是使用数据修改 cte在单个语句中执行此操作: