我的要求是从数据库中获取一个唯一的ID,以便在应用服务器(集群应用程序).For上进行处理--我有一个带有单个单元格的表,包含一个值X。这个值每次被获取时都会增加。
BEGIN TRAN
UPDATE ID_TABLE SET VALUE = VALUE + 1
SELECT VALUE FROM ID_TABLE
END TRAN考虑两个超越(T1和T2)的时间表,如下所示。更新(T1),更新(T2),读(T1),读(T2)
对于数据库事务来说,这种交织是可能的。
除了在开始时获取表上的锁并在最后释放锁之外,还有什么方法可以避免这种情况,这将隔离事务吗?
发布于 2010-09-23 10:17:11
对于数据库事务来说,这种交织是可能的吗?
不,在通常的事务隔离级别上,这种情况不会发生(见下文)。
除了获取表上的锁之外,还有什么方法可以避免这种情况发生吗?
同样,在通常的实现(如Oracle的实现)中,您在更新行时已经锁定了它。第二个事务将阻止其更新调用,直到第一个事务提交为止。另外,您将没有脏读取(从其他事务读取未提交的值)。
如果您的数据库提供了序列生成器,那么您可能应该使用该工具(它正是为此目的创建的)。
发布于 2010-09-23 10:25:11
这是由您指定的“事务隔离级别”处理的。
我不知道其他DB是如何做到这一点的,但是在Server (以及Access)中,您可以指定启动事务时应该使用的隔离级别。
备选方案如下:
对于SqlServer,默认的隔离级别是ReadCommitted。此隔离模式确保其他连接无法通过任何其他未提交的事务读取/查看修改过的数据。
有关隔离级别的更多信息,请查看这篇文章。
https://stackoverflow.com/questions/3777292
复制相似问题