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

選択ステートメントをトランザクションに含めるポイントは何ですか?

    その通りです:標準の 分離レベル , read committed 、select ステートメントをトランザクションでラップする必要はありません。 Select ステートメントは、トランザクションでラップするかどうかにかかわらず、ダーティ リードから保護されます。

    connection 1:                          connection 2:
    
                                           begin transaction
                                           update user set name = 'Bill' where id = 1
    select name from users where id = 1
                                           rollback transaction
    

    select ステートメントは、ロールバックされた更新を読み取りません。トランザクションにラップされていなくてもかまいません。

    繰り返し読み取り が必要な場合 の場合、select をデフォルトのトランザクションにラップしても役に立ちません:

    connection 1:                          connection 2:
    
    begin transaction
    select name from users where id = 1
                                           update user set name = 'Bill' where id = 1
    select name from users where id = 1
    commit transaction
    

    begin そしてcommit ここではステートメントは役に立ちません:2 番目の select かもしれません 古い名前を読むか、可能性があります 新しい名前を読んでください。

    ただし、 serializable のように、より高い分離レベルで実行する場合 または repeatable read 、グループは繰り返し不可能な読み取りから保護されます:

    connection 1:                          connection 2:
    
    set transaction isolation level
        repeatable read
    begin transaction
    select name from users where id = 1
                                           update user set name = 'Bill' where id = 1
    select name from users where id = 1              |
    commit transaction                               |
                                                     |--> executed here
    

    このシナリオでは、update 最初のトランザクションが完了するまでブロックします。

    高い分離レベルは、データベースで同時に作業できる人数を減らすため、めったに使用されません。最上位レベルでは、serializable 、レポート クエリはすべての更新アクティビティを停止します。



    1. データベースユーザー管理:MariaDBのロールの管理

    2. MySQLJavaを使用してファイルから大きなデータセットを挿入する

    3. ROWIDを使用してOracleで行/レコードを検索するのは安全ですか?

    4. XMLELEMENTを使用してXMLを構築する-ORACLESQL11gクエリ