【问题标题】:READ_UNCOMMITTED vs No transactions?READ_UNCOMMITTED 与无交易?
【发布时间】:2011-06-10 20:37:34
【问题描述】:

在事务之外执行 SQL 与在 READ_UNCOMMITTED 隔离模式下执行 SQL 有什么区别?

澄清:我试图了解java.sql.Connection.TRANSACTION_NONEjava.sql.Connection.TRANSACTION_READ_UNCOMMITTED之间的区别

【问题讨论】:

  • 您能澄清一下事务之外的 SQL 是什么意思吗?
  • @Conrad,我已经更新了问题。

标签: database jdbc isolation-level


【解决方案1】:

TRANSACTION_NONE 表示该连接根本不支持事务,任何将事务语义强加到该连接上的尝试都应该失败。我看不出这有什么用,除非你使用的是“假”数据库,比如 CSV 文件。

另一方面,READ_UNCOMMITTED 表示连接正在使用事务,并且将能够从其他连接的未提交事务中读取数据。正如@Pax 所说,这应该非常谨慎地使用。

还要注意setTransactionIsolation 方法:

请注意,Connection.TRANSACTION_NONE 不能使用,因为它指定不支持事务。

因此,您不能强制连接使用TRANSACTION_NONE - 连接要么支持事务,要么不支持,如果不支持,则不能使用此方法。

READ_UNCOMMITTED 仍然表示您正在进行交易。您仍然可以获得原子写入,并且其他事务仍然与您的写入隔离。但是,您的交易并不与其他人隔离。 TRANSACTION_NONE 对所有人免费 - 没有人会与任何事物隔绝。

【讨论】:

  • 你说的是真的,但它没有回答问题。什么是 READ_UNCOMMITTED 将我与 TRANSACTION_NONE 不隔离?
  • @Gili:我想我做到了。 READ_UNCOMMITTED 仍然意味着您正在进行交易。您仍然可以获得原子写入,并且其他事务仍然与您的写入隔离。但是,您的交易并不与其他人隔离。 TRANSACTION_NONE 对所有人免费 - 没有人会被任何事物隔离。
  • 优秀的答案!如果您将刚刚写的内容添加到上面的答案中,我会将其标记为已接受。
【解决方案2】:

READ_UNCOMMITTED(或脏读)将为您提供有关尚未完成的事务的信息。

这通常不是一个好主意,因为检索到的信息可能不一致。我们使用它来避免报告应用程序的死锁,在这些应用程序中,稍微偏离的数据并不重要,但如果您完全关心准确性(例如向人们收费或银行业务),我不会这样做。

在事务之外执行 SQL(我在这里假设更新)应该是不可能的。即使是最简单的更新,ACID 要求通常也需要事务 - 您可能不会显式地开始或提交事务,但我保证它会在幕后发生(至少对于体面的关系 DBMS 而言)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2016-03-17
  • 2015-10-13
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多