MySQLオリジナルSQL、JDBC、Springトランザクション使用


MySQLトランザクションは、単純なSql文でコミットまたはロールバックトランザクションを開くことができます.実際に使用されているSpringによるトランザクションのカプセル化では、トランザクションを宣言または注釈で制御したり、トランザクションのネスト、伝播をサポートしたりすることができます.このようなトランザクション設計を理解するためには,基本的なSqlトランザクション制御から着手する必要がある.スプリングはより強力で柔軟なトランザクション制御方式を提供していますが、一部の開発者はオリジナルのトランザクション制御方式が好きかもしれません.これははっきりしているからです.Springトランザクション設計の学習コストを増やす必要もありません.
オリジナルSQLトランザクションオープン方式
SET [GLOBAL | SESSION] TRANSACTION
    transaction_characteristic [, transaction_characteristic] ...

transaction_characteristic:
    ISOLATION LEVEL level
  | READ WRITE
  | READ ONLY

level:
     REPEATABLE READ
   | READ COMMITTED
   | READ UNCOMMITTED
   | SERIALIZABLE

注意:MySQL自体はネストされたトランザクションをサポートしていません.MySQLでトランザクションを開始すると、コミット前にトランザクションを開始すると、現在のトランザクションが自動的にコミットされます.Springは、ネストされたトランザクションを実装するときにSavePointによって実装されます.SavePointの説明:http://dev.mysql.com/doc/refman/5.7/en/savepoint.html
MySQL JDBCトランザクションの操作方法
Connection conn = DriverManager.getConnection(dbURL,dbUser,dbPassword);
conn.setAutoCommit(false);

try(Connection conn = DriverManager.getConnection(dbURL,dbUser,dbPassword);){
   conn.setAutoCommit(false);

   // perform operations such as insert, update, delete here
   // ..

   // if everything is OK, commit the transaction
   conn.commit();

} catch(SQLException e) {
   // in case of exception, rollback the transaction
   conn.rollback();
}

Springトランザクション:DataSourceTransactionManagementを例に


    


//             
public void insert(User user) {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    //        
    def.setName("UserService.insertUser");
    //          
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = txManager.getTransaction(def);
    try {
        userDao.insertUser(user);
        txManager.commit(status);
    } catch (Exception ex) {
        txManager.rollback(status);
        throw new RuntimeException(ex);
    }
}

このようなデータソース上でトランザクションを制御する方式の設計は、要求された現在のスレッドの範囲内で、データからconnectionオブジェクトを取得し、下位層がJDBC方式で現在のconnectionのトランザクションを操作し、元のJDBCに対するパッケージ方式である.したがって、このトランザクションの有効範囲は、現在のリクエストの1つのconnectionに限られます.実際の使用では、上記のようにプログラミングによってトランザクションを制御することはできないかもしれませんが、AOPや注釈を加える方法が一般的です.この方法は宣言式トランザクション制御と呼ばれています.原理も同じですが、エージェントを採用することで、これらの基本的に重複しているトランザクション制御ロジックを省くことができます.
Springのトランザクション実装では、PlatformTransactionManagerは様々なタイプのトランザクションの最上位抽象APIであり、次はSpringトランザクションのクラス図である.
Springトランザクション伝播プロパティ構成
伝播プロパティ
説明
コメント
required
現在トランザクションがない場合は、新しいトランザクションを開きます.
requires new
新しいトランザクションを作成し、トランザクションが存在する場合は現在のトランザクションを保留します.
対応する最下位レベルの保留操作は、現在のトランザクションに新しいconnectionを作成することです.
support
現在トランザクションがある場合は、トランザクションで実行し、ない場合は非トランザクションで実行します.
never
非トランザクションで実行され、トランザクションがある場合は例外が放出されます.
not supported
非トランザクションで実行され、現在トランザクションが存在する場合は現在のトランザクションが保留されます.
nested
現在トランザクションがある場合は、requiredと同じでない場合はネスト内で実行します.
mysqlはネストされたトランザクションをサポートしていません.MySQLが提供するSavePoint機能によって実現されます.
mandatory
現在のトランザクションを使用して、ない場合は例外を放出します.
さらに注意すべき点は、AOPまたは注釈という方式、すなわち、音声トランザクション方式を採用する場合、同じクラスでAメソッドがBメソッドを呼び出す場合、Bメソッドのトランザクション宣言は有効ではありません.http://stackoverflow.com/questions/18590170/transactional-does-not-work-on-method-level