gpt4 book ai didi

sql - 事务隔离问题或错误的方法?

转载 作者:太空狗 更新时间:2023-10-30 01:46:20 27 4
gpt4 key购买 nike

我正在帮助我的一些同事解决 SQL 问题。主要是他们想将所有行从表 A 移动到表 B(两个表具有相同的列(名称和类型))。虽然这是在 Oracle 11g 中完成的,但我认为这并不重要。

他们最初天真的实现是这样的

BEGIN
INSERT INTO B SELECT * FROM A
DELETE FROM A
COMMIT;
END

他们担心的是,如果在从 A 复制到 B 的过程中对表 ​​A 进行了 INSERT,而“从 A 删除”(或截断值)会导致数据丢失(删除 A 中较新插入的行)。

当然,我很快建议将复制行的 ID 存储在临时表中,然后只删除 A 中与临时表中的 ID 匹配的行。

但是出于好奇,我们通过在 INSERT 和 DELETE 之间添加等待命令(不记得 PL/SQL 语法)来进行一些测试。然后从不同的连接我们将插入行 DURING THE WAIT

我们观察到这样做会导致数据丢失。我在 SQL Server 中复制了整个上下文并将其全部包装在一个事务中,但新数据仍然在 SQL Server 中丢失了。这让我认为最初的方法存在系统性错误/缺陷。

但是我无法判断是 TRANSACTION 没有(以某种方式?)与新的 INSERT 隔离,还是 INSERT 在 WAIT 命令期间出现。

最后是用我建议的临时表实现的,但是没有得到“为什么数据丢失”的答案。你知道为什么吗?

最佳答案

根据您的隔离级别,从表中选择所有行不会阻止新的插入,它只会锁定您读取的行。在 SQL Server 中,如果您使用 Serializable 隔离级别,那么它将阻止新行,如果它们已经包含在您的选择查询中的话。

http://msdn.microsoft.com/en-us/library/ms173763.aspx -

可序列化指定以下内容:

  • 语句无法读取已修改但尚未被其他事务提交的数据。

  • 在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。

  • 在当前事务完成之前,其他事务无法插入其键值落在当前事务中任何语句读取的键范围内的新行。

    <

关于sql - 事务隔离问题或错误的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/150177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com