我的要求是从数据库中获取一个唯一的ID,以便在应用程序服务器(集群应用程序)上进行处理。为此,我有一个包含单个单元格的表,其值为X. 每次获取此值时,该值都会递增。
BEGIN TRAN
UPDATE ID_TABLE SET VALUE = VALUE + 1
SELECT VALUE FROM ID_TABLE
END TRAN
考虑如下发生的两次转录(T1和T2)的时间表。 更新(T1),更新(T2),读(T1),读(T2)
对于数据库事务,这种交错是否可行。
有没有什么办法可以避免这种情况,除了在开始时获取锁定,并最终释放它,这将隔离交易?
答案 0 :(得分:2)
对于数据库事务,这种交错是否可行?
不,在通常的事务隔离级别,这不会发生(见下文)。
除了获得锁定之外,还有什么方法可以避免这种情况
同样,在通常的实现(例如Oracle)中,您在更新行时已经锁定了该行。第二个事务将阻止其更新调用,直到第一个事务提交。此外,您不会有脏读(从另一个事务中读取未提交的值)。
如果您的数据库提供了序列生成器,您应该使用该工具(它是为了这个目的而制作的)。
答案 1 :(得分:0)
这由您指定的“交易隔离级别”处理。
我不知道在其他数据库中是如何完成的,但在Sql Server(和Access)中,您可以指定启动事务时应该使用的隔离级别。
选项包括:
对于SqlServer,默认隔离级别为ReadCommitted。 此隔离模式可确保其他连接无法通过任何其他未提交的事务读取/查看修改的数据。
有关隔离级别的更多信息,请查看this article