【问题标题】:What is the minimum level of isolation needed?所需的最低隔离级别是多少?
【发布时间】:2021-09-08 04:36:51
【问题描述】:

我想为 java 应用程序的事务使用版本。也就是说,我将在一个事务中执行select name, version from table_name where ... 和update table_name set name ='new name', version =:version+1 where vesion = :version。使用这样的事务,我试图获取我尚未处理的记录。我可以正确接收数据的最低事务隔离级别是多少?

【问题讨论】:

  • 在哪个 DBMS 中?多少个并行会话可以做同样的事情?
  • @astentx 我使用 Oracle。大约 20 节课

标签: java sql transactions isolation-level acid


【解决方案1】:

Read Uncommitted - 将看到与 Read Committed + 脏未提交更改相同,您根本不需要它。

Read Committed - 不会看到脏更改,但会看到 pfantoms、不可重复读取、可能丢失更新,因为另一个事务可以提交更改并影响您的更新。这些现象通常适用于所描述的场景。 Read Committed 不需要保持读锁直到事务结束,这是用例的最低级别,推荐。

更高级别是Repeatable Read - 为保证可重复读取和不丢失更新,数据库保持读写锁直到事务结束。 此级别仅允许幻读,因为没有获取范围锁,所以可能进行幻读。通常您不需要那么严格的级别,因为通常不可重复读取是可以的 - 您可以在重复选择后收到不同的数据,丢失的更新也适合您的用例。

最高级别是Serializable - 应该与下一个事务开始时的串行执行事务相同,仅在前一个事务结束时。你不会看到其他人提交的更新,没有幻读,没有不可重复的读取,没有丢失的更新,因为只有一个事务可以操作数据范围。你肯定不需要那个锁定

所以,Read Committed 就是答案。如果您想仔细检查,请考虑哪些错误可能导致每种现象。例如,如果您读取未提交的脏记录,修改并提交它 - 它看起来像一个巨大的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2010-11-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多