并发数据库事务

时间:2010-09-23 10:11:14

标签: database transactions concurrency

我的要求是从数据库中获取一个唯一的ID,以便在应用程序服务器(集群应用程序)上进行处理。为此,我有一个包含单个单元格的表,其值为X. 每次获取此值时,该值都会递增。

BEGIN TRAN
      UPDATE ID_TABLE SET VALUE = VALUE + 1
      SELECT VALUE FROM ID_TABLE
END TRAN

考虑如下发生的两次转录(T1和T2)的时间表。 更新(T1),更新(T2),读(T1),读(T2)

对于数据库事务,这种交错是否可行。

有没有什么办法可以避免这种情况,除了在开始时获取锁定,并最终释放它,这将隔离交易?

2 个答案:

答案 0 :(得分:2)

  

对于数据库事务,这种交错是否可行?

不,在通常的事务隔离级别,这不会发生(见下文)。

  

除了获得锁定之外,还有什么方法可以避免这种情况

同样,在通常的实现(例如Oracle)中,您在更新行时已经锁定了该行。第二个事务将阻止其更新调用,直到第一个事务提交。此外,您不会有脏读(从另一个事务中读取未提交的值)。

如果您的数据库提供了序列生成器,您应该使用该工具(它是为了这个目的而制作的)。

答案 1 :(得分:0)

这由您指定的“交易隔离级别”处理。

我不知道在其他数据库中是如何完成的,但在Sql Server(和Access)中,您可以指定启动事务时应该使用的隔离级别。

选项包括:

  • 读取未提交的
  • read committed
  • 可重复阅读
  • 序列化

对于SqlServer,默认隔离级别为ReadCommitted。 此隔离模式可确保其他连接无法通过任何其他未提交的事务读取/查看修改的数据。

有关隔离级别的更多信息,请查看this article