2009-04-03 21 views
1

(私はDAOパターン実装では単純なCRUD APIを持っています) すべての操作(save、load、update、delete)には、トランザクションIDを指定する必要があります。 だからです。行うにはその可能性:ロードの呼び出しを除くトランザクション理論

...

id = begintransaction(); 
dao.save(o, id); 
sao.update(o2, id); 
rollback(id); 

すべての例では、直感的なようです。しかし、データベースからオブジェクトをロードするとすぐに、物事はちょっと違ってきます。トランザクションごとに定義されたロード操作はありますか?または、負荷操作を単一の作業量としてカウントする必要がありますか?

答えて

4

使用しているトランザクション分離レベル(http://en.wikipedia.org/wiki/Isolation_(database_systems))によって異なりますが、一般的にはトランザクションの一部である必要があります。他の誰かがあなたが読もうとしているデータを更新している最中であればどうでしょうか?読み取り操作がトランザクションでない場合は、古いデータを取得し、最新のデータに興味があるかもしれません。

2

データベースが適切な分離レベルに設定されている場合、コミットされていない書き込みは、それらを作成したトランザクションからのみ読み取ることができます。たとえば、プロシージャが行を挿入または更新した後でコミットせずに「プラグマautonomous_transaction」を使用して別のプロシージャをコールすると、別のプロシージャは新しい行を表示しません。 (足に自分を撃つための素晴らしい方法、btw)。

このため、トランザクションに関連付けられたロード操作を常に考慮する必要があります。