2012-04-07 3 views
2

Ich habe eine Datenbanktabelle, die jede Zeile eine einzelne Aufgabe darstellt. Die Zeile enthält auch ein Feld [Completed], das wahr sein sollte, wenn die Aufgabe bei jeder anderen Gelegenheit erfolgreich oder falsch ausgeführt wurde.Was ist der beste Ansatz zum Aktualisieren einer Datenbanktabelle basierend auf dem Ergebnis der nicht transaktionalen Task

Nehmen wir an, dass die Aufgabe durch die Funktion unten dargestellt:

bool Task(int TaskId); 

, die auf Erfolg der Aufgabe und falsch bei Ausfall true zurück.

Was ist der beste Weg, um das Feld Completed der Task-Tabelle basierend auf dem Ergebnis der Task zu aktualisieren?

A haben Ansätze gedacht:

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] 

Wie kann ich die Aufgabe gelingt aber Datenbank-Update vermeiden kann nicht abgeschlossen werden?

+0

Vielleicht ist es vor Kaffee für mich, aber bis die Transaktion festgeschrieben wird - die boolesche Funktion wird false zurückgeben, es sei denn, Sie lesen schmutzige Daten (READ UNCOMMITTED). –

+0

Die boolesche Funktion ist nicht datenbankbezogen. Es tut etwas, was nicht mit der Datenbank zusammenhängt. Betrachten Sie den Code psevdo-code. – Blim

Antwort

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

Sie Rollbacks nicht für eine versagende Aufgabe verwenden. Es hat schlechte Leistung und ich würde es aus semantischen Gründen auch vermeiden. Ihre Funktion hat schließlich Erfolg, also sollte die tran ordnungsgemäß machen.

+0

Die Sache ist, dass Bool Task() überhaupt nicht auf die Datenbank bezogen ist. Ich betrachte das folgende Szenario: 1) Starten der Transaktion. 2) Starten der Aufgabe. 3) Während der Task weiterhin ausgeführt wird - die Kommunikation mit dem SQL Server ist unterbrochen. 4) Aufgabe erfolgreich beendet. 5) Datenbank wird nicht entsprechend aktualisiert. Ich denke, dass es keine Möglichkeit gibt, die Aufgabe auszuführen und die Datenbank in einem atomaren Schritt zu aktualisieren. – Blim

+0

Sie haben Recht. Wenn die Verbindung verloren ist, hast du verloren. Sie schreiben die Aufgabe, ein Erfolgsprotokoll in eine Datei zu schreiben, die später abgerufen wird. – usr

Verwandte Themen