Dun*_*can 2 sql-server identity
我们必须自己修改数据库并管理IDENTITY列(而不是依赖于auto-inc字段).
我们的解决方案是有一个"生成器"表,它有一个auto-inc字段.我们插入此表,然后读取SCOPE_IDENTITY值以获取我们的新ID,例如
insert into NewIDEntity
(CreationDate)
select
GetDate()
select @EntityID = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
我们主要关注以下场景:
•事务1 INSERTS进入NewID并接收101作为要插入实体表的新ID.
•在它可以提交之前,将事务2 INSERTS转换为NEWID并且还接收101作为新ID(这是因为SCOPE_IDENTITY()将在当前范围的上下文中返回ID.原始行尚未提交,因此我们期望值为101)
•事务1提交并写入行.
•事务2尝试提交但已写入101并导致主键违规并中止事务.
但是在运行时,似乎SCOPE_IDENTITY()由SQL Server处理,即使在READ UNCOMMITTED隔离级别下运行,我们也不会发生冲突.
这没关系,还是我们找不到的东西?
谢谢邓肯
身份生成基本上不在任何事务的范围内 - 一旦生成ID,ID计数器总是会受到冲击,而不仅仅是在提交事务时.这导致身份序列在事务回滚时存在间隙,但这是因为它确保了您所描述的那种情况下的安全性.
| 归档时间: |
|
| 查看次数: |
3565 次 |
| 最近记录: |