68316
データベースのトランザクション分離レベルですが、例えばSQL
serverでデータベース単位にトランザクション分離レベルを設定した上で、クライアント側でセッション単位に指定した場合どちらの設定が有効になるのでしょうか？
CC BY-SA 4.0
2020-07-05T09:07:08.823
68298
2020-07-05T21:23:22.813
9228
question
database sql-server
データベースのトランザクション分離レベルの設定について
「SQL serverでデータベース単位にトランザクション分離レベルを設定」がどのような操作を想定されているのか不明です。少なくとも[ALTER
DATABASE の SET オプション](https://docs.microsoft.com/ja-
jp/sql/t-sql/statements/alter-database-transact-sql-set-options?view=sql-
server-ver15)にトランザクションに関わる設定はありません。

トランザクション分離レベルは、同時に実行される複数のトランザクションが相互にどのように影響を及ぼしあうか、影響を与えないようにするかに関する規定であり、一般的には各々のクエリに対するロックで実現されます。

SQL Serverにおいても[`SET TRANSACTION ISOLATION
LEVEL`](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-transaction-
isolation-level-transact-sql?view=sql-server-
ver15)で現在のトランザクションに対するトランザクション分離レベルを設定できますが、それはトランザクションに含まれる各々のクエリに対する[テーブルヒント](https://docs.microsoft.com/ja-
jp/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-
ver15)（のロックに対する指定）のデフォルト値を変更する行為に対応します。例えば、

```

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
```

と指定するのは、全てのクエリに`NOLOCK`もしくは`READUNCOMMITTED`ヒントを付与することを意味します。しかし、個々のクエリ側に明示的に`UPDLOCK`など別のロックヒントを付与した場合、トランザクション分離レベルの設定とは異なる挙動をします。

> クライアント側でセッション単位に指定した場合どちらの設定が有効になるのでしょうか？

というわけでそもそもどちらというわけがありませんし、最終的には各々のクエリがどのようなロックヒントで実行されるかで決まります。
CC BY-SA 4.0
2020-07-05T21:23:22.813
68316
2020-07-05T21:23:22.813
4236
68298
answer