2
1

More than 1 year has passed since last update.

Sequelizeでトランザクション処理を行う際のtransactionオプションの配置場所

Last updated at Posted at 2022-03-07

初めに

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メソッドだとエラーが出力されない様なので注意が必要。

参考文献

Sequeizeのトランザクションに関して

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1