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

一時テーブルのトリガーとトランザクション

    トリガーを理解していないと思います。トリガーの起動は、トランザクションがコミットされたときではなく、トリガーが関連するステートメントに関連付けられています。 2 つのスクリプト:

    スクリプト 1:

    create table T1 (
        ID int not null,
        Val1 varchar(10) not null
    )
    go
    create table T2 (
        ID int not null,
        Val2 varchar(10) not null
    )
    go
    create trigger T_T1_I
    on T1
    after insert
    as
        insert into T2 (ID,Val2) select ID,Val1 from inserted
    go
    begin transaction
    insert into T1 (ID,Val1)
    select 10,'abc'
    go
    RAISERROR('Run script 2 now',10,1) WITH NOWAIT
    WAITFOR DELAY '00:01:00'
    go
    commit
    

    スクリプト 2:

    select * from T2 with (nolock)
    

    同じ DB への 2 つの接続を開き、各接続に 1 つのスクリプトを配置します。スクリプト 1 を実行します。「今すぐスクリプト 2 を実行してください」というメッセージが表示されたら、別の接続に切り替えます。データがトリガーによって挿入されたとしても、T2 からコミットされていないデータを選択できることがわかります。 (これは、トリガーがコミットされるまで、スクリプト 1 によって T2 で適切なロックが保持されていることも意味します)。

    これは、ベース テーブルに挿入してトランザクションを開いたままにしておくことと同じことを意味するため、それを行うことができます。

    テーブルの実際の形をユーザーに見せたくない場合は、view を作成します それにトリガーを書き込んで、ベーステーブルを更新します。ただし、上で述べたように、ビューに対して DML 操作を実行するとすぐに、トリガーが起動され、ベース テーブルに対してロックが保持されます。他の接続のトランザクション分離レベルによっては、変更が表示されるか、トランザクションがコミットされるまでブロックされる場合があります。



    1. wp_postmetaテーブルのWooCommerceシリアル化メタ値配列

    2. Oracleデータ変更通知のタイムアウトとワークフロー

    3. Python:mysqlテーブルから選択する場合、タプルインデックスはstrではなく整数である必要があります

    4. ブール値の配列をMySqlデータベースに保存するにはどうすればよいですか?