初めに
Sequelizeでマネージドトランザクションを使用する際に、transactionオプションの配置場所がメソッドによって異なっていたので備忘録として投稿する。
結論として、Sequelizeのトランザクション処理に使用するtransactionオプションはcreate、updateのようなメソッドは第2引数に、その他のメソッドは第1引数に渡す必要がある。
理由は、create、updateのようなメソッドには更新するべき値を記載するが、その他のfindAll等のメソッドには更新するべき値がないため、その影響で引数の格納場所が異なっていると考えられる。
今回はupdateメソッドとfindAllメソッドを例にとって記載する。
環境
■ Sequelizeバージョン
3.30.4
■ 使用OS
Amazon Lunux 2
■ MySQLバージョン
5.7.35
updateメソッド
Sequelizeを使用してトランザクション処理を行う
上記記事を参照いただきたいが、updateメソッドだと以下のような書き方で正常に動作する。
User.update(
{ money: 500 },
{ where: {id: 1}, transaction: tx }
)
また更新する値を第1引数に記載している。
{ money: 500 }
findAllメソッド
findAllメソッドでは、updateメソッドの様に更新する値を記載していないため、第1引数にtransactionオプションを配置する。
User.findAll(
{ where: {money: 500 }, transaction: tx }
);
findAllメソッドでtransactionオプションを第2引数に渡すと以下のようなエラーになる。
User.findAll(
{ where: {money: 500 } },
{ transaction: tx });
Error: Please note that find* was refactored and uses only one options object from now on.
findAllメソッドだと分かりやすくエラーが出力されるが、findOneメソッドだとエラーが出力されない様なので注意が必要。