今回はMakeのACIDモジュールとAuto commitについて触れていきたいと思います。
ACIDモジュールとは
Makeのフローを作成しているときに「ACID」というマークが付いているモジュールを見かけた事はありますでしょうか?
DayaStoreやMySQLなど、データベース操作を行うモジュールに付いています。
このモジュールはトランザクションモジュールと呼ばれ、ロールバックが可能なモジュールです。
シナリオ後半のモジュールでエラーが発生した場合に、これまで実行していたACIDモジュールの実行は無かった事にできます。
シナリオ設定の「Auto commit」について
この設定はACIDモジュールに影響します。
“Scenario settings”の“Auto commit”が「Yes」になっている場合は、各モジュールの実行が完了した直後にコミットされます。この場合、シナリオの途中でエラーが発生した場合でもACIDモジュールの実行結果はロールバックされません。
“Scenario settings”の“Auto commit”が「No」になっている場合は、すべてのシナリオ操作が完了した時点でコミットされます。シナリオの途中でエラーが発生した場合、ACIDモジュールの実行はロールバックされます。
※ACIDモジュール以外のモジュールはこの設定に関係なく、各モジュールの実行が完了した直後にコミットされます。例えば、GmailのSend an Emailモジュールで送信したメールは取り消す事はできません。
DataStoreを使用して、実際の動きを確認
今回使用するDataStore
商品名と在庫数だけを管理するシンプルなデータストアを作成しました。
今回使用するシナリオ
上で作成したDataStoreから商品一覧を取得し、すべての商品の在庫数を順に50に更新するシンプルなシナリオを作成しました。
正常終了した場合は単純にすべての商品の在庫が50になりますが、今回は動作検証のため、2周目のBandleで必ずエラーが発生するようにしています。
“Auto commit”が「Yes」の場合
“Auto commit”はシナリオ作成時にデフォルトでYesになっています。
まずはこの状態でシナリオを実行してみます。
シナリオがエラーになります。
Bandle1は正常に終了し、Bandle2でエラーが発生しています。
DataStoreを確認すると、エラー直前に実行されていたBandle1(りんごの在庫を50にする)操作はコミットされています。
Bandle2でエラーが発生したため、シナリオはその時点で停止され、残りの商品は更新されていない事が確認できます。
DataStore内のデータが中途半端に更新されてしまっています。
“Auto commit”が「No」の場合
一度、DataStoreの在庫数をすべて10に戻します。
“Auto commit”をNoに変更し、再度シナリオを実行してみます。
同じく、Bandle2でエラーが発生します。
DataStoreを確認すると、りんごの在庫数は10のままになっています。
エラー直前に実行されていたBandle1(りんごの在庫を50にする)操作はロールバックされている事が確認できます。
まとめ
このように、“Auto commit”を「No」にしておくことで、シナリオ途中でエラーが発生した場合に、ACIDモジュールの操作を無かったことにできます。
DataStoreやMySQLへのデータ更新などで、中途半端な更新を防ぎたい場合やデバッグ作業などでも活用が期待できます。