Fråga : bygga bo transactionscopes

hi experts

see som kodifiera below.
this kodifierar, får utförd när som helst I-räddningen en ro eller en bordlägga till database.A ((den ISaveable) enheten). för räddning (); metoden kan också appellen som en annan metod för räddning () för barn bordlägger, eller barnet rows.
so den InternalUpdateEntity () metoden får kallade multipeltider, och multipeltransactionscopes är used.

Now jag måste ifrågasätter/Problems.
1. ska alla de använder den samma transactionscopen eller alltid ny och gör detta gör även avkänning. Bör jag förbättra precis skapar en transactionscope?

2. när jag får ett concurrencyfel i en bygga bo transactionscope. mitt applikation ska kast ett transactionaborted undantag, illvilja faktumet att jag fångar faktiskt exakt detta undantag?
What kunde orsaka det?

thanks i förskott för din förmiddag för help
I genom att använda VS 2008, C#, .NET 3.5, seger Forms

> för
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
" codeBody " " >private utan laga kraft InternalUpdateEntity för class= " för 1 && ror [0]. Bordlägga! = ogiltigt) Enheten = ror [0]. Bordlägga; annars retur; om (vaeCollection.IsCollectionValid-&&enhet! = ogiltigt) { Boolean ConcurrencyError = falskt; använda (TransactionScope Ts = ((ogiltig this.ParentTransaction-==)? nya TransactionScope (): nya TransactionScope (this.ParentTransaction))) { försök { om (ogiltig this.ParentTransaction-==) this.ParentTransaction = Transaction.Current.DependentClone (DependentCloneOption.BlockCommitUntilComplete); om (UpdateAction == UpdateAction.Update) { om (enheten är ISaveable || Enheten är ISaveMultipleRows), { om (enheten är ISaveMultipleRows && Rows.Length > 1), ((ISaveMultipleRows) enhet). Räddning (ror); annars ((ISaveable) enhet). Räddning (); } } annars, om (UpdateAction == UpdateAction.Delete) { om (enheten är IDeleteable || Enheten är IDeleteMultipleRows), { om (enheten är IDeleteMultipleRows && Rows.Length > 1), { ((IDeleteMultipleRows) enhet) .DeleteObject (ror); om (DoCommit) ((IDeleteMultipleRows) enhet) .CommitDeletedObject (ror); } annars { ((IDeleteable) enhet) .DeleteObject (); om (DoCommit) ((IDeleteable) enhet) .CommitDeletedObject (); } } } Ts.Complete (); } fånga (TransactionAbortedException före detta) { om (this.DatabaseUpdateError! = ogiltigt) { stränga meddelandet = ”Fehler \ r \ n”; om (ex.InnerException! = ogiltigt) Meddelande += ex.InnerException.Message + ”\ r \ nStacktrace: ” + ex.InnerException.StackTrace; annars Före detta för meddelande +=. Meddelande + ”\ r \ nStacktrace: ” + ex.StackTrace; this.DatabaseUpdateError (nya ExceptionEventArgs (meddelande)); } om annars (ex.InnerException! = ogiltigt) kast ex.InnerException; annars kastföre detta; } fånga (DBConcurrencyException dex) { om (ConcurrencyErrorOccured! = ogiltigt) this.ConcurrencyErrorOccured (dex. Ro nya EventArgs ()); //ConcurrencyError = true; Ts.Dispose (); retur; } } } }
> för
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
" codeBody " " >private utan laga kraft InternalUpdateEntity för class= " för 1 && ror [0]. Bordlägga! = ogiltigt) Enheten = ror [0]. Bordlägga; annars retur; om (vaeCollection.IsCollectionValid-&&enhet! = ogiltigt) { Boolean ConcurrencyError = falskt; använda (TransactionScope Ts = (nya TransactionScope ()) { försök { om (UpdateAction == UpdateAction.Update) { om (enheten är ISaveable || Enheten är ISaveMultipleRows), { om (enheten är ISaveMultipleRows && Rows.Length > 1), ((ISaveMultipleRows) enhet). Räddning (ror); annars ((ISaveable) enhet). Räddning (); } } annars, om (UpdateAction == UpdateAction.Delete) { om (enheten är IDeleteable || Enheten är IDeleteMultipleRows), { om (enheten är IDeleteMultipleRows && Rows.Length > 1), { ((IDeleteMultipleRows) enhet) .DeleteObject (ror); om (DoCommit) ((IDeleteMultipleRows) enhet) .CommitDeletedObject (ror); } annars { ((IDeleteable) enhet) .DeleteObject (); om (DoCommit) ((IDeleteable) enhet) .CommitDeletedObject (); } } } Ts.Complete (); } fånga (TransactionAbortedException före detta) { om (this.DatabaseUpdateError! = ogiltigt) { stränga meddelandet = ”Fehler \ r \ n”; om (ex.InnerException! = ogiltigt) Meddelande += ex.InnerException.Message + ”\ r \ nStacktrace: ” + ex.InnerException.StackTrace; annars Före detta för meddelande +=. Meddelande + ”\ r \ nStacktrace: ” + ex.StackTrace; this.DatabaseUpdateError (nya ExceptionEventArgs (meddelande)); } om annars (ex.InnerException! = ogiltigt) kast ex.InnerException; annars kastföre detta; } fånga (DBConcurrencyException dex) { om (ConcurrencyErrorOccured! = ogiltigt) this.ConcurrencyErrorOccured (dex. Ro nya EventArgs ()); //ConcurrencyError = true; Ts.Dispose (); retur; } } } }
" klar "

Svar : bygga bo transactionscopes

kontrollera ut denna trevliga artikel:

http://www.15seconds.com/issue/060413.htm
Andra lösningar  
 
programming4us programming4us