首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发数据库事务

并发数据库事务
EN

Stack Overflow用户
提问于 2010-09-23 10:11:14
回答 2查看 3.1K关注 0票数 2

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

代码语言:javascript
复制
BEGIN TRAN
      UPDATE ID_TABLE SET VALUE = VALUE + 1
      SELECT VALUE FROM ID_TABLE
END TRAN

考虑两个超越(T1和T2)的时间表,如下所示。更新(T1),更新(T2),读(T1),读(T2)

对于数据库事务来说,这种交织是可能的。

除了在开始时获取表上的锁并在最后释放锁之外,还有什么方法可以避免这种情况,这将隔离事务吗?

EN

回答 2

Stack Overflow用户

发布于 2010-09-23 10:17:11

对于数据库事务来说,这种交织是可能的吗?

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

除了获取表上的锁之外,还有什么方法可以避免这种情况发生吗?

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

如果您的数据库提供了序列生成器,那么您可能应该使用该工具(它正是为此目的创建的)。

票数 2
EN

Stack Overflow用户

发布于 2010-09-23 10:25:11

这是由您指定的“事务隔离级别”处理的。

我不知道其他DB是如何做到这一点的,但是在Server (以及Access)中,您可以指定启动事务时应该使用的隔离级别。

备选方案如下:

  • 读未承诺
  • 宣读承诺
  • 可重复读
  • 串行化

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

有关隔离级别的更多信息,请查看这篇文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3777292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档