如何让DB为后续事务返回不同的行?

时间:2010-07-28 08:09:01

标签: java mysql database hibernate

我在多线程环境中有以下流程

  1. 启动交易
  2. 从db
  3. 中读取n个顶行(基于列)
  4. 检查一些标准
  5. 更新这些行
  6. 提交/回滚交易
  7. 我使用乐观锁来处理多线程场景,但在上面的情况下,DB总是返回相同的行集,因此如果第二个线程同时运行它将始终失败。

    有没有更好的方法来解决这个问题? 我们可以使用某个选项强制DB为每个事务返回不同的行集吗?

1 个答案:

答案 0 :(得分:1)

您为所有主题获得相同的热门n记录的原因是因为 ACID中的 I (原子性,一致性,隔离性,持久性)交易原则。隔离意味着其他操作无法访问在尚未完成的事务期间已修改的数据。因此,在您的线程提交其事务之前,其他线程无法看到它们已完成的操作。

可以将大多数数据库中的 Isolation level 更改为以下之一:

  • SERIALIZABLE
  • REPEATABLE READ
  • READ COMMITTED
  • READ UNCOMMITTED

在您的情况下,您可能希望READ UNCOMMITTED,因为它允许一个事务查看某些其他事务所做的未提交的更改。

注意:对于大多数应用程序来说,这几乎肯定是错误的隔离级别,并且可能导致数据损坏。如果您在此处描述的其他应用程序正在访问同一个数据库,您可能不会我想更改隔离级别,因为这些应用程序可能会开始看到意外和不正确的行为。