データベーストランザクションリファレンス

データベース操作をトランザクションのコンテキストで実行できます。各操作に transactionalAction があります。これは、有効なトランザクションがある場合に、トランザクションに関して、操作で実行できる結合アクションの種別を特定します。たとえば、Select 操作には次の可能なアクションがあります。

Always join (常時結合)、Join if Possible (可能な場合に結合)、Not Supported (サポート対象外)
  • ALWAYS_JOIN: メッセージの受信時にトランザクションが進行中であると想定します。トランザクションがない場合、エラーが発生します。

  • JOIN_IF_POSSIBLE: 現在のトランザクションが使用可能な場合、そのトランザクションを結合します。それ以外の場合、トランザクションは実行されません。

  • NOT_SUPPORTED: 存在するトランザクションの外部で実行します。

操作のグループ化

場合によっては、複数のクエリを同じトランザクションのコンテキストでアトミックに実行する必要があります。たとえば、銀行口座振替中は 1 つの口座から金額を引き、別の口座に加える必要がありますが、この 2 つの操作のいずれかが失敗した場合、両方の操作をロールバックする必要があります。

<db:update config-ref=”db”>
	<db:sql>UPDATE ACCOUNT set BALANCE = BALANCE - :money where ID = :source</db:sql>
	<db:input-parameters>#[{‘money’ : payload.money, ‘source’: payload.source}]</db:input-parameters>
</db:update>

<db:update config-ref=”db”>
	<db:sql>UPDATE ACCOUNT set BALANCE = BALANCE + :money where ID = :target</db:sql>
	<db:input-parameters>#[{‘money’ : payload.money, ‘target’’: payload.target}]</db:input-parameters>
</db:update>

これらのクエリを、すでに存在するトランザクションのコンテキストで実行した場合、クエリは同じトランザクションに属します。有効なトランザクションがない場合は、<try> スコープを使用してトランザクションを開始できます。

<try transactionalAction="ALWAYS_BEGIN">
	<db:update config-ref="db">
		<db:sql>UPDATE ACCOUNT set BALANCE = BALANCE - :money where ID = :source</db:sql>
		<db:input-parameters>#[{'money' : payload.money, 'source': payload.source}]</db:input-parameters>
	</db:update>

	<db:update config-ref="db">
		<db:sql>UPDATE ACCOUNT set BALANCE = BALANCE + :money where ID = :target</db:sql>
		<db:input-parameters>#[{'money' : payload.money, 'target'': payload.target}]</db:input-parameters>
	</db:update>
</try>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub