2

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

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

4

2 回答 2

4

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

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

还要注意setTransactionIsolation方法:

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

所以你不能强制使用一个连接TRANSACTION_NONE——连接要么支持事务,要么不支持,如果不支持,你就不能乱用这个方法。

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

于 2011-01-18T14:22:00.430 回答
0

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

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

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

于 2011-01-18T04:22:19.790 回答