我有一个 id 设置为 Primary_key/is_identity 的表,所以我想知道是否可以假设使用相反顺序查找SELECT TOP 1刚刚插入的BEGIN TRANSACTION行的正确性:COMMIT TRANSACTION
BEGIN TRANSACTION
INSERT INTO [MyTable] ([description], [name])
VALUES ('animal', 'cat')
SELECT TOP (1) [id], [description], [name]
FROM [MyTable]
ORDER BY [id] DESC
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
考虑到上述限制和交易指令,这总是正确的吗?
不,您不能依赖于获取您插入的行,因为其他人可能在您插入行之后但在您选择之前TOP (1)插入了一行,是的,即使在事务内也是如此。在高并发情况下,除非您使事务可序列化,否则这将导致眼泪。但这是不必要的,因为您始终可以使用伪表获取插入的行:inserted
INSERT INTO dbo.MyTable ([description], [name])
OUTPUT inserted.id, inserted.description, inserted.name
VALUES ('animal', 'cat');
Run Code Online (Sandbox Code Playgroud)
对于单行插入,是的,您可以使用SCOPE_IDENTITY(),但OUTPUT适用于单行和多行插入。
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |