JAVAでのトランザクション処理

リリース: 2020-06-16 16:12:39
転載
3597 人が閲覧しました

JAVAでのトランザクション処理

1. Java トランザクションとは何ですか?

通常の概念では、トランザクションはデータベースに関連していると考えられます。トランザクションとはデータベースにアクセスするための一連の操作であり、データベース アプリケーション システムはトランザクション セットを通じてデータベースへのアクセスを完了します。トランザクションが正しく実行されると、データベースはある状態から別の状態に遷移します。

トランザクションは、ISO/IEC によって確立された ACID 原則に準拠する必要があります。

ACID は、Atomicity、Consistency、Isolation、Durability の略称で、トランザクションは ISO/IEC で定められた ACID 原則に準拠する必要があります。 ACID は、原子性、一貫性、分離性、耐久性の略語です。

a. アトミック性

は不可分性を意味し、すべてのトランザクションが実行されるか、何も実行されないかのいずれかです。トランザクションのすべてのサブトランザクションが正常に送信されると、すべてのデータベース操作が送信され、データベースの状態が変換されます。いずれかのサブトランザクションが失敗すると、他のサブトランザクションのデータベース操作がロールバックされ、データベースは元の状態に戻ります。トランザクションが実行される前の状態であり、状態遷移は発生しません。

b. 一貫性

トランザクションの実行により、データベースはある正しい状態から別の正しい状態に変換されます。

c、分離

トランザクションが正しくコミットされる前、つまりトランザクションが正しくコミットされる前は、トランザクションによるデータへの変更を他のトランザクションに提供することはできません。 、その考えられる結果は他のトランザクションに表示されるべきではありません。

d. 耐久性

トランザクションが正しく送信されると、その結果はデー​​タベースに永続的に保存され、トランザクション送信後に他の障害が発生した場合でも、トランザクションの処理結果は保持されます。救われます。

トランザクションの概念はデータベースから来ていますが、Java トランザクションとは何でしょうか?どういう関係があるのでしょうか?

実際、Java アプリケーション システムがデータベースを操作する場合、それは JDBC を通じて実装されます。その後、追加、変更、削除はすべて対応するメソッドを通じて間接的に実装され、トランザクションの制御もそれに応じて Java プログラム コードに移されます。したがって、データベース操作トランザクションは慣例的に Java トランザクションと呼ばれます。

2. トランザクションが必要な理由

簡単に言うと、データの一貫性を維持することです。

3. Java トランザクションの種類

Java トランザクションには、JDBC トランザクション、JTA (Java Transaction API) トランザクション、コンテナ トランザクションの 3 種類があります。ここでは最も簡単な紹介を行い、最後に jdbc トランザクションの使用法を紹介します。他の 2 種類については自分で検索して学習することができます。

a. JDBC トランザクション

JDBC トランザクションは、Connection オブジェクトを使用して制御されます。 JDBC 接続インターフェース (java.sql.Connection) は、自動送信と手動送信という 2 つのトランザクション モードを提供します。 java.sql.Connection は、トランザクションを制御する次のメソッドを提供します。

 public void setAutoCommit(boolean)
 public boolean getAutoCommit()
 public void commit()
 public void rollback()
ログイン後にコピー

JDBC トランザクション境界を使用する場合、複数の SQL ステートメントを 1 つのトランザクションに結合できます。 JDBC トランザクションの欠点の 1 つは、トランザクションの範囲が 1 つのデータベース接続に制限されていることです。 JDBC トランザクションは複数のデータベースにまたがることはできません。

b. JTA (Java トランザクション API) トランザクション

JTA は、実装に依存せず、プロトコルに依存しない高レベルの API です。アプリケーションおよびアプリケーション サーバーは、JTA を使用してトランザクションにアクセスできます。

JTA を使用すると、アプリケーションは分散トランザクションを実行できます。つまり、複数のデータベースに分散できる 2 つ以上のネットワーク コンピュータ リソース上のデータにアクセスして更新できます。 JDBC ドライバーの JTA サポートにより、データ アクセス機能が大幅に強化されます。

JTA を使用してトランザクションを定義する場合は、javax.sql.XADataSource、javax.sql.XAConnection、および javax.sql.XAResource インターフェースを実装する JDBC ドライバーが必要になります。

これらのインターフェイスを実装するドライバーは、JTA トランザクションに参加できます。 XADataSource オブジェクトは、XAConnection オブジェクトのファクトリです。 XAConnection は、JTA トランザクションに参加する JDBC 接続であり、アプリケーション サーバーの管理ツールを使用して XADataSource を設定する必要があります。

J2EE アプリケーションは、JNDI を使用してデータ ソースをクエリします。アプリケーションはデータ ソース オブジェクトを見つけると、javax.sql.DataSource.getConnection() を呼び出してデータベースへの接続を取得します。

XA 接続は、非 XA 接続とは異なります。 XA 接続は JTA トランザクションに参加することを覚えておくことが重要です。これは、XA 接続が JDBC の自動コミット機能をサポートしていないことを意味します。同時に、アプリケーションは XA 接続で java.sql.Connection.commit() または java.sql.Connection.rollback() を呼び出してはなりません。

代わりに、アプリケーションは UserTransaction.begin()、UserTransaction.commit()、および serTransaction.rollback() を使用する必要があります。

c. コンテナ トランザクション

コンテナ トランザクションは主に J2EE アプリケーション サーバーによって提供されます。ほとんどのコンテナ トランザクションは JTA に基づいて完了します。これは、JNDI に基づいたかなり複雑な API 実装です。 JTAトランザクション管理をコーディングで実現する場合と比較して、J2EEアプリケーションサーバが提供するEJBコンテナが提供するコンテナトランザクション管理機構(CMT)を利用することで同じ機能を実現できます。

これにより、トランザクションに追加するメソッドを簡単に指定できるようになり、指定すると、コンテナーがトランザクション管理タスクを担当するようになります。これは私たちの土木工学ソリューションです。この方法により、論理コーディングからトランザクション コードを除外できると同時に、すべての問題の解決を J2EE コンテナーに任せることができるからです。

使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。

d、JDBC事务的使用

(1)步骤:

首先,设置事务的提交方式为非自动提交:conn.setAutoCommit(false);接下来,将需要添加事务的代码放入try,catch块中。

然后,在try块内添加事务的提交操作,表示操作无异常,提交事务:conn.commit();尤其不要忘记,在catch块内添加回滚事务,表示操作出现异常,撤销事务:conn.rollback();最后,设置事务提交方式为自动提交:conn.setAutoCommit(true);这样,通过简单的几步,我们就可以完成对事务处理的编写了。

(2)伪代码:

con = DriverManager.getConnection(url, user, password);
String result = "";
String sql1 = "";
// LAST_INSERT_ID() 获取刚刚插入的自动递增的ID
String sql2 = "";
int flag;
try {
    con.setAutoCommit(false);// 更改JDBC事务的默认提交方式
    pstmt = con.prepareStatement(sql1);
    flag = pstmt.executeUpdate();
    if (flag > 0) {
        pstmt = con.prepareStatement(sql2);
        int i = pstmt.executeUpdate();
        if (i > 0) {
            con.commit();//提交JDBC事务
            result = "add data success!!";
        } else {
            result = "add data fail!!";
       }
    } else {
        result = "add data fail!!";
    }
} catch (SQLException e) {
    try {
        con.rollback();//回滚JDBC事务
    } catch (SQLException e1) {
    // TODO Auto-generated catch block
        result = "add data fail!! SQLException";
        e1.printStackTrace();
    }
    result = "add data fail!! SQLException";
    e.printStackTrace();
} finally {
    try {
        con.setAutoCommit(true); // 恢复JDBC事务的默认提交方式
    } catch (SQLException e) {
    // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
return result;
ログイン後にコピー

4、三种事务差异

1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。

2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。

3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

5、总结

事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。

更多相关知识请关注java基础教程栏目

以上がJAVAでのトランザクション処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:oschina.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート