sql-server - 两个 (SELECT TOP 1 +1 ) 语句和两个 INSERTS 同时

标签 sql-server database transactions

如果在执行事务时,另一台客户端计算机执行插入操作,会发生什么情况?

我有两台客户端计算机和一个数据库。这些计算机上有相同的程序。假设我们有订单表和 salesorder# 列,该列是唯一的。

如果两台计算机同时执行,我知道 SQL Server 将选择其中一个事务并让另一个等待。所以这个交易做以下

@ordernumber= SELECT TOP Salesorder# +1 .
 INSERT INTO order (salesorder#,dateship, user) VALUES (@ordernumber,GETDATE(),1,)

我相信如果两者同时发生,它只会选择 then 之一,完全运行,然后对另一个做同样的事情。对吗?

在不同的场景中会发生什么。如果事务开始,并且在 SELECT 语句之后但在 INSERT 发生之前请求另一个 INSERT(不是 TRANSACTION Just INSERT 语句)。

SQL Server 在这种情况下会做什么?这可能吗?

最佳答案

一句话:不要这样做!!失败-肯定会。

假设您有一个最大数量为 100 的表 - 现在您有两个(或多个)并发用户请求执行插入操作。

两个请求都将首先读取最高数字 (100),每个请求都会将其递增 +1 - 因此两者的内部值均为 101。 SELECT 语句只会执行一个快速的共享锁 - 但SELECT 会起作用并且会读取100. 他们是否在交易中在这里没有区别 - 只是因为交易不会停止第二个 SELECT 的发生。

INSERT 实际上创建一个独占锁 - 但仅在行被插入(不是整张 table !)。没有什么可以阻止两个并发请求插入它们的新行,并且都将尝试插入一个 salesorder# 值为 101 的行。如果您对此有唯一约束,其中一个请求将失败,因为另一个请求已经插入了值 101。

这是您应该手动处理连续 ID 的众多原因之一 - 让数据库处理它,使用 INT IDENTITY 列,或 SEQUENCE 对象。

关于sql-server - 两个 (SELECT TOP 1 +1 ) 语句和两个 INSERTS 同时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084475/

相关文章:

java - SQLite 使用连接提交批处理 Java

sql-server - 如何从单个表中获取 'matched' 和 'unmatched' 行

java - 用于范围分页的数据库缓存策略

database - 何时使用 CouchDB 与 RDBMS

mysql - 复制未更新所有表

PHP PDO 模块未提交事务,未上报原因

c# - Microsoft.SqlServer.Types 在 Azure 辅助角色上无法正常运行

sql-server - 从 Excel 导入到 SQL Server 2008 时转换数据类型时出错

sql-server - 存储动态调查问卷的有效方法?

sqlite - 如何在Ionic 2和SQLite上处理事务和相关记录?