

Node.jsのORMとしてTypeORMを使用しているのですが、ドキュメント(<https://typeorm.io/#/transactions>)を確認すると

[code]

    import {getManager} from "typeorm";
    await getManager().transaction("SERIALIZABLE", transactionalEntityManager => {
    
    });
    
[/code]

のようにトランザクションごとに分離レベルを変更できる仕様になっていました。

クエリログを確認するとトランザクションを開始する前に毎回

[code]

    SET TRANSACTION ISOLATION LEVEL ...
    
[/code]

で分離レベルを変更していたのですが、分離レベルはグローバルな設定と認識しています。  
そんなに頻繁に変更してもよいものなのでしょうか？分離レベルを変えると更新時にDB内部で行うことがかなり変わると思うのですが...。


CC BY-SA 4.0
2020-08-19T07:57:38.420
69692
2020-08-23T01:03:41.460
2020-08-19T10:44:41.153
32986
41551
question
mysql node.js
トランザクションごとにMySQLの分離レベル変更した場合、DBへの負荷はいか程でしょうか？


> 分離レベルはグローバルな設定と認識しています。

[MySQL 5.6 リファレンスマニュアル 13.3.6 SET TRANSACTION
構文](https://dev.mysql.com/doc/refman/5.6/ja/set-transaction.html)によると、  
「`SET TRANSACTION ISOLATION LEVEL ...`」は現在のセッション内で実行されるトランザクションが対象のようです。 ※
MySQLのバージョンによって異なるかもしれません

> そんなに頻繁に変更してもよいものなのでしょうか？

セッション毎の変更であれば「トランザクションごとに分離レベルを変更できる仕様」の想定内だと思います。  
すべてのセッションに対してトランザクションレベルを変えるには次の条件が必要なので、頻繁に変更することはできないでしょう。

  * SUPER 権限が必要
  * アクティブなトランザクションが存在しない

> 分離レベルを変えると更新時にDB内部で行うことがかなり変わると思うのですが...。

残念ながら私の知識レベルではコメントできません。  
外から見た振る舞いについて以下のページが参考になると思います。  
[トランザクション分離レベルについてのまとめ](https://qiita.com/song_ss/items/38e514b05e9dabae3bdb)


CC BY-SA 4.0
2020-08-23T01:03:41.460
69784
2020-08-23T01:03:41.460
35558
69692
answer