mysqlのトランザクション


一、MySqlの中の事務
MySQLトランザクションは、主に操作量が多く、複雑度の高いデータの処理に使用されます.たとえば、人員管理システムでは、人員を削除するには、人員の基本資料を削除するだけでなく、ポスト、文章などの人員に関する情報を削除する必要があります.これにより、これらのデータベース操作文はトランザクションを構成します.
  • MySQLでは、Innodbデータベースエンジンを使用しているデータベースまたはテーブルのみがトランザクションをサポートします.
  • トランザクションは、データベースの整合性を維持し、一括SQL文がすべて実行されるか、すべて実行されないかを保証するために使用できます.
  • トランザクションはinsert,update,delete文
  • を管理するために使用されます.
    二、事務の四大特性(ACID)
  • 原子間性(Atomicity)トランザクション全体のセルは、すべて成功するか、すべて失敗します.トランザクション(transaction)のすべての操作は、すべて完了するか、すべて完了しないか、中間の一環で終了しません.トランザクションは実行中にエラーが発生し、このトランザクションが実行されたことがないように、トランザクションが開始される前の状態にロールバックされます.
  • コンシステンシトランザクションの実行前後の結果は一致する必要があります.トランザクションの開始前とトランザクションの終了後、データベースの整合性は破壊されません.これは、書き込まれた資料がすべてのプリセット規則に完全に合致しなければならないことを示しています.これは、資料の精度、直列性、および後続のデータベースが自発的に所定の作業を完了できることを含む.
  • 独立性(Isolation)トランザクション間は互いに独立し、互いに影響を受けないようにしなければならない.データベースでは、複数の同時トランザクションがデータの読み書きと変更を同時に行うことができます.独立性により、複数のトランザクションが同時実行されると、クロス実行によってデータが一致しないことが防止されます.トランザクション・アイソレーションは、リード・コミット(Read uncommitted)、リード・コミット(read committed)、リピート可能リード(repeatable read)、シリアル化(Serializable)の
  • など、異なるレベルに分けられます.
  • 永続性(Durability)トランザクションがコミットされると永続化されて保存され、トランザクションが完了すると、トランザクションによるデータベースのすべての更新がデータベースに保存され、ロールバックできません.トランザクションが終了すると、システム障害が発生してもデータの変更は永続的に行われます.

  • 注意:
    MySQLコマンドラインのデフォルト設定では、トランザクションは自動的にコミットされます.つまり、SQL文を実行するとすぐにCOMMIT操作が実行されます.したがって、トランザクションを明示的に開くには、コマンドBEGINまたはSTART TRANSACTIONを使用するか、コマンドSET AUTOMMIT=0を実行して、現在のセッションの自動コミットを使用しないようにします.
    三、事務の二大動作
  • コミット(commit)
  • ロールバック
  • 四、事務の同時問題
  • ダーティリード
  • トランザクションAは、トランザクションBが更新するデータを読み出し、Bロールバック操作を行うと、Aが読み出すデータはダーティデータ
  • となる.
  • 繰り返し不可
  • トランザクションAは同じデータを複数回読み出し、トランザクションBはトランザクションAが複数回読み出している間にデータを更新してコミットし、トランザクションAが複数回同じデータを読み出す場合、結果が一致しない(修正操作に重点を置く)
  • .
  • 幻読み
  • システム管理者Aはデータベースのすべての学生の成績を具体点数からABCDE等級に変更したが、システム管理者Bはこの時に具体点数の記録を挿入し、システム管理者Aの変更が終わった後、もう一つの記録が変更されていないことに気づき、幻覚が発生したように幻読(新規または削除に重点を置く)
  • と呼ばれた.

    五、MySQLトランザクションの独立性レベル
    トランザクション独立性レベル
    汚読
    繰り返し不可
    まぼろし読み
    読み取り未コミット(read-uncommitted)
    はい
    はい
    はい
    読み取りコミット(read-committed)
    いいえ
    はい
    はい
    リピート可能(repeatable-read)
    いいえ
    いいえ
    はい
    シリアル化
    いいえ
    いいえ
    いいえ
    六、mysql、oracleのデフォルトの独立性レベル
    mysqlのデフォルトの独立性レベルはrepeatable-readです
    oracleのデフォルトの独立性レベルはread committedです
    クエリー・トランザクションの独立性レベル:select@@tx_isolation
    トランザクションの独立性レベルの設定:set session transaction isolation level read committed
    七、隔離レベルの選択
  • 両極端の場合は選択しません
  • read uncommittedとserializableは一般的に
  • は使用されません.
  • 一般的には、デフォルトの独立性レベル
  • を使用します.

    八、取引制御文
  • BEGINまたはSTART TRANSACTIONは、トランザクションを明示的に開く.
  • COMMITはCOMMIT WORKも使えますが、両者は等価です.COMMITはトランザクションをコミットし、データベースに対するすべての変更を永続化します.
  • ROLLBACKはROLLBACK WORKも使えますが、両者は等価です.ロールバックすると、ユーザーのトランザクションが終了し、コミットされていないすべての変更が取り消されます.
  • SAVEPOINT identifier、SAVEPOINTはトランザクションに1つの保存ポイントを作成することを許可し、1つのトランザクションに複数のSAVEPOINTがあることができる.
  • RELEASE SAVEPOINT identifierトランザクションのセーブポイントを削除します.指定されたセーブポイントがない場合、文を実行すると例外が放出されます.
  • ROLLBACK TO identifierはトランザクションをタグポイントにロールバックします.
  • SET TRANSACTIONは、トランザクションの独立性レベルを設定するために使用されます.InnoDBストレージエンジンが提供するトランザクションの独立性レベルは、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLEです.

  • 九、MYSQL事務処理には主に二つの方法がある.
    1、BEGIN、ROLLBACK、COMMITで実現
  • BEGINトランザクション
  • を開始
  • ROLLBACKトランザクションロールバック
  • COMMIT事務確認
  • 2、直接SETでMySQLの自動提出モードを変更する:
  • SET AUTOMMIT=0自動提出禁止
  • SET AUTOMMIT=1オートコミット
  • をオン
    十、jdbc操作取引
    private Statement statement;
    private Connection conn;
    
    @Test
    public void test01() throws Exception {
        /*     */
        //    
        //    
        //  sql  
        //    
        //    
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
        statement = conn.createStatement();
        ShiWuCaoZuo(500, "xiaoming", "xiaohua");
        statement.close();
        conn.close();
    }
    
    
    public void ShiWuCaoZuo(Integer money, String from, String to) throws Exception {
        conn.setAutoCommit(false);//    
        ResultSet resultSet = statement.executeQuery("select balance from account WHERE name='" + from + "'");
        if (resultSet.next()) {
            int balance = resultSet.getInt("balance");
            if (balance >= money) {
                statement.execute("update account set balance=balance-" + money + " where name='" + from + "'");
                statement.execute("update account set balance=balance+" + money + " where name='" + to + "'");
            } else {
                conn.rollback();//  
                System.out.println("    ....");
            }
        }
        conn.commit();//    
    }
    

    もっとブログを読むにはこちらをクリックしてください.https://lisongbai.top/