sql >> データベース >  >> RDS >> Mysql

MySQL-STARTTRANSACTIONがアクティブかどうかを確認する方法

    トランザクション内でのみ発生する可能性のあるエラーを悪用するプロシージャを作成できます:

    DELIMITER //
    CREATE PROCEDURE `is_in_transaction`(OUT $transaction bool)
    BEGIN
        DECLARE oldIsolation TEXT DEFAULT @@TRANSACTION_ISOLATION;
        DECLARE EXIT HANDLER FOR 1568 BEGIN
            -- error 1568 will only be thrown within a transaction
            SET $transaction = true;
        END;
        -- will throw an error if we are within a transaction
        SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
        -- no error was thrown - we are not within a transaction
        SET TRANSACTION_ISOLATION = oldIsolation;
        SET $transaction = false;
    END//
    DELIMITER ;
    

    手順をテストします:

    set @within_transaction := null;
    set @out_of_transaction := null;
    
    begin;
        CALL is_in_transaction(@within_transaction);
    commit;
    
    CALL is_in_transaction(@out_of_transaction);
    
    select @within_transaction, @out_of_transaction;
    

    結果:

    @within_transaction | @out_of_transaction
    --------------------|--------------------
                      1 |                   0
    

    MariaDBでは、@@in_transactionを使用できます



    1. SQL SELECT AVG

    2. MySQLストアドプロシージャの「データベース照合」名を変更します

    3. MySQLでランダムな日付を挿入/更新

    4. mysqlがトリガーでlast_insert_id()を取得する