Pergunta : transactionscopes aninhados

olá! experts

see que o código do código below.
this começ executado sempre que eu conservo uma fileira ou uma tabela ao database.
A (entidade (de ISaveable)). Conservar () o ; o método pode igualmente chamar outro excepto () o método para tabelas da criança ou a criança rows.
so o método de InternalUpdateEntity () começ épocas múltiplas chamadas e os transactionscopes múltiplos são used.

Now que eu tenho que as perguntas/Problems.
1. eles todo o uso o mesmo transactionscope ou sempre um novo e faço este faço mesmo o sentido. Devo eu melhorar apenas crio um transactionscope?

2. quando eu começ um erro da simultaneidade em um transactionscope aninhado. minha aplicação jogará uma exceção transactionaborted, apesar do fato de que eu travo realmente exatamente esta exceção? o
What podia causar aquele?

thanks adiantado para seu help
I am usando-se CONTRA 2008, C#, .NET 3.5, vitória Forms

class= > " desobstruído " do
> do " codeSnippet " do class= do
class= " lineNumbers " do
class= do
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:
>private notpretty InternalUpdateEntity vago " do class= " do id= " codeSnippet787896 do
 1 && enfileira [0]. Tabela! = zero)
                Entidade = fileiras [0]. Tabela;
            mais
                retorno;

            se (entidade do && de vaeCollection.IsCollectionValid! = zero)
            {
                ConcurrencyError bôoleano = falso;
                
                utilização (Ts de TransactionScope = ((zero do == de this.ParentTransaction)? TransactionScope novo (): TransactionScope novo (this.ParentTransaction)))
                {
                    tentativa
                    {
                        se (zero do == de this.ParentTransaction)
                            this.ParentTransaction = Transaction.Current.DependentClone (DependentCloneOption.BlockCommitUntilComplete);

                        se (== UpdateAction.Update de UpdateAction)
                        {
                            se (a entidade é ISaveable || A entidade é ISaveMultipleRows)
                            {
                                se (a entidade é && de ISaveMultipleRows Rows.Length > 1)
                                    (Entidade (de ISaveMultipleRows)). Conservar (fileiras);
                                mais
                                    (Entidade (de ISaveable)). Conservar ();
                            }
                        }
                        mais se (== UpdateAction.Delete de UpdateAction)
                        {
                            se (a entidade é IDeleteable || A entidade é IDeleteMultipleRows)
                            {
                                se (a entidade é && de IDeleteMultipleRows Rows.Length > 1)
                                {
                                    (Entidade (de IDeleteMultipleRows)) .DeleteObject (fileiras);

                                    se (DoCommit)
                                        (Entidade (de IDeleteMultipleRows)) .CommitDeletedObject (fileiras);
                                }
                                mais
                                {
                                    (Entidade (de IDeleteable)) .DeleteObject ();

                                    se (DoCommit)
                                        (Entidade (de IDeleteable)) .CommitDeletedObject ();
                                }
                            }
                        }

                        Ts.Complete ();
                    }
                    prendedor (TransactionAbortedException ex)
                    {
                        se (this.DatabaseUpdateError! = zero)
                        {
                            amarrar a mensagem = “Fehler \ r \ n”;

                            se (ex.InnerException! = zero)
                                Mensagem += ex.InnerException.Message + “\ r \ nStacktrace: ” + ex.InnerException.StackTrace;
                            mais
                                Mensagem += ex. Mensagem + “\ r \ nStacktrace: ” + ex.StackTrace;

                            this.DatabaseUpdateError (ExceptionEventArgs novo (mensagem));
                        }
                        mais se (ex.InnerException! = zero)
                            lance ex.InnerException;
                        mais
                            lance ex;
                    }
                    prendedor (dex de DBConcurrencyException)
                    {
                        se (ConcurrencyErrorOccured! = zero)
                            this.ConcurrencyErrorOccured (dex. Fileira, EventArgs novo ());
                        //ConcurrencyError = retifica;
                        Ts.Dispose ();
                        retorno;
                    }
                }
        }
}
class= > " desobstruído " do
> do " codeSnippet " do class= do
class= " lineNumbers " do
class= do
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:
>private notpretty InternalUpdateEntity vago " do class= " do id= " codeSnippet787912 do
 1 && enfileira [0]. Tabela! = zero)
                Entidade = fileiras [0]. Tabela;
            mais
                retorno;

            se (entidade do && de vaeCollection.IsCollectionValid! = zero)
            {
                ConcurrencyError bôoleano = falso;
                
                usar-se (Ts de TransactionScope = (TransactionScope novo ())
                {
                    tentativa
                    {
                       
                        se (== UpdateAction.Update de UpdateAction)
                        {
                            se (a entidade é ISaveable || A entidade é ISaveMultipleRows)
                            {
                                se (a entidade é && de ISaveMultipleRows Rows.Length > 1)
                                    (Entidade (de ISaveMultipleRows)). Conservar (fileiras);
                                mais
                                    (Entidade (de ISaveable)). Conservar ();
                            }
                        }
                        mais se (== UpdateAction.Delete de UpdateAction)
                        {
                            se (a entidade é IDeleteable || A entidade é IDeleteMultipleRows)
                            {
                                se (a entidade é && de IDeleteMultipleRows Rows.Length > 1)
                                {
                                    (Entidade (de IDeleteMultipleRows)) .DeleteObject (fileiras);

                                    se (DoCommit)
                                        (Entidade (de IDeleteMultipleRows)) .CommitDeletedObject (fileiras);
                                }
                                mais
                                {
                                    (Entidade (de IDeleteable)) .DeleteObject ();

                                    se (DoCommit)
                                        (Entidade (de IDeleteable)) .CommitDeletedObject ();
                                }
                            }
                        }

                        Ts.Complete ();
                    }
                    prendedor (TransactionAbortedException ex)
                    {
                        se (this.DatabaseUpdateError! = zero)
                        {
                            amarrar a mensagem = “Fehler \ r \ n”;

                            se (ex.InnerException! = zero)
                                Mensagem += ex.InnerException.Message + “\ r \ nStacktrace: ” + ex.InnerException.StackTrace;
                            mais
                                Mensagem += ex. Mensagem + “\ r \ nStacktrace: ” + ex.StackTrace;

                            this.DatabaseUpdateError (ExceptionEventArgs novo (mensagem));
                        }
                        mais se (ex.InnerException! = zero)
                            lance ex.InnerException;
                        mais
                            lance ex;
                    }
                    prendedor (dex de DBConcurrencyException)
                    {
                        se (ConcurrencyErrorOccured! = zero)
                            this.ConcurrencyErrorOccured (dex. Fileira, EventArgs novo ());
                        //ConcurrencyError = retifica;
                        Ts.Dispose ();
                        retorno;
                    }
                }
        }
}
class= do

Resposta : transactionscopes aninhados

verific para fora este artigo agradável:

http://www.15seconds.com/issue/060413.htm
Outras soluções  
 
programming4us programming4us