But *does* the user need to know to call session.BeginTransaction? In my example, are you saying that I would need to explicitly manage bot the TransactionScope and NH ITransaction ?
Thanks!! -Michael ________________________________ From: [email protected] [[email protected]] On Behalf Of Fabio Maulo [[email protected]] Sent: Monday, March 23, 2009 10:13 AM To: [email protected] Subject: [nhibernate-development] Re: More DTC issues For those reasons the ITransaction shouldn't be a merely "ADO.NET<http://ADO.NET> transaction wrapper" (or so near to it). session.BeginTransaction should know which is the environment, it should know if it should run in a nested DTC transaction ... and so on. The user only need to know that i must call session.BeginTransaction, NH should to the right thing. 2009/3/23 Michael Teper <[email protected]<mailto:[email protected]>> Fabio, Ayende, Another thing to consider is the nested transaction scenario like this: using (var scopeOuter = new TransactionScope()) { // load / change some object(s) using (var innerScope = new TransactionScope()) { try { // load / change something else innerScope.complete(); } catch { // do something } } outerScope.complete(); } This may look silly but if the inner transaction is encapsulated in a different class, this is a very plausible scenario. Wherever NH keeps track of the current transaction scope, it needs to be aware of potential for nesting. Thanks! -Michael ________________________________ From: [email protected]<mailto:[email protected]> [[email protected]<mailto:[email protected]>] On Behalf Of Fabio Maulo [[email protected]<mailto:[email protected]>] Sent: Monday, March 23, 2009 9:45 AM To: [email protected]<mailto:[email protected]> Subject: [nhibernate-development] Re: More DTC issues 2009/3/23 Ayende Rahien <[email protected]<mailto:[email protected]>> The problem is that usually the DTC is opened by a lower level component, and my code has no control over it. More than that, I usually don't have control over NH's code as well. It goes like this: 1/ low level infrastructure - dtc 2/ high level infarstruture - nh 3/ business code - my stuff and then 3 -end 2- end 1-end If 2 don't know about 1, 2 should use session.BeginTransaction and session.Transaction.Commit(). I don't want to be aware of all of this issues, I just want to make this work. So explicitly flushing is an option that I would generally be against. Making NH's transaction equal to the dtc is also not a good option, because the use of the DTC is to manage several resources, not just NH. You know... I never said dtc=nhTx What I would like to avoid is If(DTC) {something} else {somethingelse} inside NH-Core. -- Fabio Maulo -- Fabio Maulo
