トランザクションの外部でSQLを実行することと、READ_UNCOMMITTED分離モードでSQLを実行することの違いは何ですか?
明確化: java.sql.Connection.TRANSACTION_NONEとjava.sql.Connection.TRANSACTION_READ_UNCOMMITTEDの違いを理解しようとしています
トランザクションの外部でSQLを実行することと、READ_UNCOMMITTED分離モードでSQLを実行することの違いは何ですか?
明確化: java.sql.Connection.TRANSACTION_NONEとjava.sql.Connection.TRANSACTION_READ_UNCOMMITTEDの違いを理解しようとしています
TRANSACTION_NONE
これは、接続がトランザクションをまったくサポートしておらず、その接続にトランザクションセマンティクスを課そうとすると失敗することを意味します。CSVファイルのような「偽の」データベースを使用している場合を除いて、これがこれまでに役立つとは思えません。
READ_UNCOMMITTED
一方、は、接続がトランザクションを使用しており、他の接続のコミットされていないトランザクションからデータを読み取ることができることを意味します。@Paxが言ったように、これは細心の注意を払って使用する必要があります。
setTransactionIsolation
方法にも注意してください。
Connection.TRANSACTION_NONE
トランザクションがサポートされていないことを指定しているため、使用できないことに注意してください。
したがって、接続を強制的に使用することはできません。TRANSACTION_NONE
接続はトランザクションをサポートするかサポートしないかのどちらかであり、サポートしない場合は、このメソッドを台無しにすることはできません。
READ_UNCOMMITTED
それでも、トランザクションを実行していることを意味します。アトミック書き込みは引き続き取得され、他のトランザクションは書き込みから分離されたままになります。ただし、あなたの取引は他の人々から隔離されていません。TRANSACTION_NONE
すべての人に無料です-誰も何からも孤立することはありません。
READ_UNCOMMITTED(またはダーティリード)は、まだ完了していないトランザクションに関する情報を提供します。
取得される情報に一貫性がない可能性があるため、通常はお勧めできません。わずかにずれたデータが問題にならないアプリケーションのレポートでデッドロックを回避するために使用しましたが、正確性(人への請求や銀行の請求など)をまったく気にしない場合は、それを行いません。
トランザクションの外部でSQLを実行すること(ここでは更新を想定しています)は実際には不可能なはずです。ACID要件は通常、最も単純な更新でもトランザクションを必要とします。トランザクションを明示的に開始またはコミットすることはできませんが、(少なくとも適切なリレーショナルDBMSの場合は)内部で行われることを保証します。