READ_UNCOMMITTED vs无交易?

时间:2011-01-18 04:00:00

标签: database jdbc isolation-level

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

澄清:我正在尝试理解java.sql.Connection.TRANSACTION_NONEjava.sql.Connection.TRANSACTION_READ_UNCOMMITTED

之间的区别

2 个答案:

答案 0 :(得分:3)

TRANSACTION_NONE表示连接根本不支持事务,任何在该连接上强制执行事务语义的尝试都将失败。我不能看到它有用,除非您使用“假”数据库,例如CSV文件。

另一方面,

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

另请注意setTransactionIsolation方法:

  

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

所以你不能强制连接使用TRANSACTION_NONE - 连接要么支持事务要么不支持事务,如果没有,你就不能搞乱这种方法。

READ_UNCOMMITTED仍然意味着您正在进行交易。您仍然可以获得原子写入,而其他事务仍然与您的写入隔离。但是,您的交易并非与其他人的隔离。 TRANSACTION_NONE对所有人都是免费的 - 没有人可以与任何人隔离。

答案 1 :(得分:0)

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

这通常不是一个好主意,因为检索到的信息可能不一致。我们已经用它来避免在报告应用程序时遇到死锁,这些应用程序中的轻微数据无关紧要,但如果你完全关心准确性(比如向人们收钱或银行业务),我就不会这样做。

在事务之外执行SQL(我假设在这里更新)应该不可能。即使是最简单的更新,ACID要求通常也需要交易 - 您可能不会明确地对交易进行BEGIN或COMMIT,但我保证它将在封面下发生(至少对于一个体面的关系DBMS而言)。