2012-04-07 6 views
2

各行が1つのタスクを表すデータベーステーブルがあります。この行には、[Completed]フィールドも含まれています。このフィールドは、タスクが正常に完了した場合はtrueになり、それ以外の場合はfalseになります。タスクの成功した場合にTRUE、失敗するとfalseを返します非トランザクションタスクの結果に基づいてデータベーステーブルを更新する最適な方法は何ですか

bool Task(int TaskId); 

を:

タスクは、以下の関数で表されることを前提としています。

Taskの結果に基づいてTask TableのCompletedフィールドを更新する最も良い方法は何ですか?

Aはアプローチを考えている:

A.

BEGIN TRANSACTION 

UPDATE TASKS SET Completed = 1 WHERE [email protected] 

if (Task(SpecificTask)) 
    COMMIT TRANSACTION 
else 
    ROLLBACK TRANSACTION 

B.

if (Task(SpecificTask)) 
    UPDATE TASKS SET Completed = 1 WHERE [email protected] 

がどのようにタスクが続く回避することができますが、データベースの更新が完了することができないのですか?

+0

おそらく、私にとってはBefore Coffeeですが、トランザクションがコミットされるまでは、不正なデータを読み取っていない限り、ブール関数はfalseを返します(READ UNCOMMITTED)。 –

+0

ブール関数はデータベースに関連していません。それはデータベースと関係のない何かをします。コードpsevdo-codeを考えてみましょう。 – Blim

答えて

1
begin tran 
if (Task(SpecificTask)) 
    UPDATE TASKS SET Completed = 1 WHERE [email protected] 
commit 

失敗したタスクにロールバックを使用しないでください。それは不快なパフォーマンスを持っており、私は意味的な理由からもそれを避けるだろう。あなたの関数は結局は成功したので、tranは秩序だったはずです。

+0

これは、bool Task()がデータベースにまったく関係していないことです。私は以下のシナリオを考えます: 1)取引開始。 2)タスクの開始。 3)タスクの実行中 - SQL Serverとの通信が失われます。 4)タスクが正常に完了しました。 5)データベースはそれに応じて更新されません。タスクを実行し、アトミック・ステップでデータベースを更新する方法はないと私は思っています。 – Blim

+0

あなたは正しいです。接続が失われた場合、あなたは失われてしまいます。あなたは、タスクを後で取り上げられるいくつかのファイルに成功のログを書き込むようにします。 – usr

関連する問題