データベース操作において、トランザクションは非常に重要な概念です。トランザクションは、データベースの一貫性と整合性を維持するために、一連のデータベース操作が正常に実行されるか、失敗した場合にはロールバックされることを保証します。Java では、JDBC を使用してトランザクションを管理できます。この記事では、JDBC トランザクション管理の方法とサンプル コードを詳しく紹介するとともに、基本的な初心者向けに簡単かつ明確に説明します。
トランザクションとは何ですか
データベースでは、トランザクションは単一の作業単位として扱われる一連の SQL 操作です。トランザクションには、ACID プロパティとも呼ばれる次の 4 つの主要なプロパティがあります。
-
アトミック性: トランザクションはアトミックであり、すべてが正常に実行されるか、すべてが失敗してロールバックされます。いずれかの操作が失敗すると、トランザクション全体が失敗し、部分的な変更は残りません。
-
一貫性: データベースは、トランザクションの実行前後に、ある一貫した状態から別の一貫した状態に移行します。これは、トランザクションが主キーや一意性制約などのデータベースの整合性制約に従う必要があることを意味します。
-
分離: 複数のトランザクションを同時に実行できますが、相互に干渉することはできません。1 つのトランザクションによる変更は、コミットされるまで他のトランザクションには表示されません。
-
耐久性: トランザクションが正常に送信されると、その結果はデータベースに永続的に保存され、システムに障害が発生しても失われることはありません。
JDBCトランザクション管理
JDBC (Java Database Connectivity) は、データベースと対話するための Java の API です。JDBC は、Java プログラムでデータベース トランザクションを管理する方法を提供します。
オープントランザクション
JDBC でトランザクションを開始するには、次の手順を実行する必要があります。
- データベース接続 (Connection) オブジェクトを作成します。
- 接続の自動コミット モードを に設定します
false
。これは、トランザクションが自動的にコミットされないことを意味します。 - トランザクション内で一連の SQL 操作を実行します。
- 最後に、操作の成功または失敗に応じて、トランザクションをコミットするかロールバックするかを選択します。
以下は、JDBC トランザクションを開始する方法を示すサンプル コードです。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TransactionExample {
public static void main(String[] args) {
String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) {
// 关闭自动提交,开启事务
connection.setAutoCommit(false);
// 执行一系列数据库操作
// 提交事务
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
// 发生异常,回滚事务
connection.rollback();
}
}
}
上記のコードでは、setAutoCommit(false)
メソッドを通じて自動コミット モードをオフにし、try
ブロック内で一連のデータベース操作を実行します。例外が発生した場合は、ブロック内のメソッドをcatch
呼び出してトランザクションをロールバックします。rollback()
トランザクションのコミットとロールバック
JDBC では、トランザクションをコミットするには、commit()
上の例に示すようにメソッドを使用できます。トランザクションがコミットされると、トランザクション内のすべての操作がデータベースの一部になります。
トランザクション中に問題が発生した場合、rollback()
このメソッドを使用してトランザクションをロールバックし、コミットされていない変更を取り消し、データベースをトランザクション開始前の状態に復元できます。上の例では、ブロック内のメソッドをcatch
呼び出してトランザクションをロールバックしました。rollback()
トランザクション分離レベルを設定する
JDBC では、トランザクションの分離レベルを設定して、複数のトランザクションが相互に対話する程度を制御できます。JDBC は、低から高まで、次の 4 つのトランザクション分離レベルをサポートします。
-
TRANSACTION_NONE : トランザクションはサポートされていません。各 SQL ステートメントは自動的にコミットされ、ロールバックされません。
-
TRANSACTION_READ_UNCOMMITTED : コミットされていないデータ変更の読み取りを許可します。これは、あるトランザクションが別のトランザクションのコミットされていないデータを参照できることを意味します。
-
TRANSACTION_READ_COMMITTED : コミットされたデータ変更のみが読み取りを許可されます。これは、ほとんどのデータベース システムのデフォルトの分離レベルです。
-
TRANSACTION_REPEATABLE_READ : トランザクション内で同じデータが複数回読み取られるときにデータが変更されないことを保証します。ただし、他のトランザクションは引き続き新しいデータを挿入できます。
-
TRANSACTION_SERIALIZABLE : 最も高い分離レベル。トランザクション間の完全な分離を保証し、同時アクセスを許可しません。
トランザクション分離レベルを設定するには、setTransactionIsolation()
メソッドを使用できます。サンプルコードは次のとおりです。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TransactionIsolationExample {
public static void main(String[] args) {
String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) {
// 设置事务隔离级别为 TRANSACTION_SERIALIZABLE
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// 关闭自动提交,开启事务
connection.setAutoCommit(false);
// 执行一系列数据库操作
// 提交事务
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
// 发生异常,回滚事务
connection.rollback();
}
}
}
上記のコードでは、メソッドを通じてsetTransactionIsolation()
トランザクション分離レベルを最高レベルの分離に設定します。Connection.TRANSACTION_SERIALIZABLE
注意が必要な事項
トランザクション管理に JDBC を使用する場合は、いくつかの重要な考慮事項があります。
-
接続を閉じる: トランザクション終了後は必ずデータベース接続を閉じてください。try-with-resources を使用するか、finally ブロックで接続を閉じると、リソースが正しく解放されるようになります。
-
例外処理: 発生する可能性のある SQLException を捕捉して処理します。適切なエラー処理を使用して、catch ブロック内のトランザクションをロールバックします。
-
コミット頻度: 必要に応じてトランザクションをいつコミットするかを選択します。SQL ステートメントごとにコミットするのではなく、ビジネス ニーズに基づいてコミット ポイントを決定します。
-
分離レベル: 同時実行性と一貫性のバランスをとるために、適切なトランザクション分離レベルを選択します。分離レベルを高くするとパフォーマンスが低下するため、アプリケーションのニーズに基づいて分離レベルをトレードオフしてください。
-
テストとデバッグ: トランザクションは、運用前に完全にテストおよびデバッグされ、適切に動作することが確認されます。
結論
トランザクション管理はデータベース操作に不可欠な部分であり、データの一貫性と整合性を確保します。JDBC を使用すると、トランザクションの開始、コミット、ロールバックを簡単に行うことができ、さまざまなアプリケーションのニーズを満たすためにトランザクションの分離レベルを制御できます。この記事が、JDBC におけるトランザクション管理の理解を深めるのに役立つことを願っています。
著者情報 著者:Fanyi CSDN: https: //techfanyi.blog.csdn.net Nuggets:https://juejin.cn/user/4154386571867191 |