Sql server 在SQL Server中,是在insert语句执行时还是在事务提交时生成/分配标识值?
某些表有一个带有主键和标识约束的Sql server 在SQL Server中,是在insert语句执行时还是在事务提交时生成/分配标识值?,sql-server,transactions,primary-key,Sql Server,Transactions,Primary Key,某些表有一个带有主键和标识约束的INT列。当两个并发事务向表中插入一行时,哪一个事务将以更高的列值结束,是稍后执行INSERT语句的事务还是稍后结束/提交的事务?ID是在执行INSERT操作期间生成的,因此在INSERT(2)之前执行的INSERT(1)将具有较低的ID(当然,如果增量为正:)ID是在执行INSERT操作期间生成的,因此在INSERT(2)之前执行的INSERT(1)将具有较低的ID(当然,如果增量为正:))identity值是在行被持久化到磁盘的那一刻分配的-因此,当事务开始时
INT
列。当两个并发事务向表中插入一行时,哪一个事务将以更高的列值结束,是稍后执行INSERT语句的事务还是稍后结束/提交的事务?ID是在执行INSERT操作期间生成的,因此在INSERT(2)之前执行的INSERT(1)将具有较低的ID(当然,如果增量为正:)ID是在执行INSERT操作期间生成的,因此在INSERT(2)之前执行的INSERT(1)将具有较低的ID(当然,如果增量为正:))identity值是在行被持久化到磁盘的那一刻分配的-因此,当事务开始时,实际上是不相关的-数据被写入的那一刻是在分发标识值时,即使事务回滚,也会认为使用了标识,因此,较低的id值适用于首先启动的insert语句。列是主键这一事实与问题无关。好吧,我重新措辞了问题。我需要了解一个开始较早但结束较晚的事务是否可能生成较低的列值。@ivan-如果您需要某种形式的时间顺序,请做一些事情来明确地获得它。不要对标识列的值进行任何假设。您应该将它们视为恰好适合数字列的不透明斑点。不要试图对他们的价值观进行任何推理。@Damien_不信者,说得好。我只需要了解一些bug可能来自何处。identity
值是在行被持久化到磁盘的那一刻分配的-因此,当事务开始时,实际上是不相关的-数据被写入的那一刻是在分发标识值时,即使事务回滚,标识也将被视为已使用,因此,较低的id值适用于首先启动的insert语句。列是主键这一事实与问题无关。好吧,我重新措辞了问题。我需要了解一个开始较早但结束较晚的事务是否可能生成较低的列值。@ivan-如果您需要某种形式的时间顺序,请做一些事情来明确地获得它。不要对标识列的值进行任何假设。您应该将它们视为恰好适合数字列的不透明斑点。不要试图对他们的价值观进行任何推理。@Damien_不信者,说得好。我只需要了解一些bug可能来自哪里。这是否取决于事务何时提交?或者在事务流中处理INSERT时是否直接声明标识值?提交或回滚事务无关紧要。处理INSERT时声明标识值。这是否取决于提交事务的时间?或者在事务流中处理INSERT时是否直接声明标识值?提交或回滚事务无关紧要。在处理INSERT时声明标识值。