This exception happens whenever you try to use a transaction
(distributed transaction in this case) which has already been
completed. I think NHibernate is too late in executing the Delete
statement.

On Sun, Mar 22, 2009 at 6:57 PM, Ayende Rahien <[email protected]> wrote:
> Hm, another problem that I run into, and I am not sure what the problem is:
>
> public void CanDeleteItemInDtc()
>
>         {
>
>             object id;
>
>             using (var tx = new TransactionScope())
>
>             using (var s = sessions.OpenSession())
>
>             {
>
>                 id = s.Save(new Person
>
>                 {
>
>                     CreatedAt = DateTime.Today
>
>                 });
>
>                 new ForceEscalationToDistributedTx();
>
>
>
>                 tx.Complete();
>
>             }
>
>             using (var tx = new TransactionScope())
>
>             using (var s = sessions.OpenSession())
>
>             {
>
>                 new ForceEscalationToDistributedTx();
>
>
>
>                 s.Delete(s.Get<Person>(id));
>
>                 tx.Complete();
>
>             }
>
>         }
>
> This is failing with a System.Data.SqlClient.SqlException: Distributed
> transaction completed. Either enlist this session in a new transaction or
> the NULL transaction.
>
> On Sun, Mar 22, 2009 at 9:55 AM, Ayende Rahien <[email protected]> wrote:
>>
>> Correction, the DTC infrastructure will report the transaction failure
>> back on TX dispose.
>> Sweat, so my solution looks good enough to push for production.
>>
>> On Sun, Mar 22, 2009 at 9:52 AM, Ayende Rahien <[email protected]> wrote:
>>>
>>> Just run into this issue.
>>>
>>> What would you expect this to do?
>>>
>>> [Test]
>>>
>>> public void WillNotCrashOnDtcPrepareFailure()
>>>
>>> {
>>>
>>>     using(var tx = new TransactionScope())
>>>
>>>     {
>>>
>>>         using (var s = sessions.OpenSession())
>>>
>>>         {
>>>
>>>             s.Save(new Person
>>>
>>>             {
>>>
>>>                 CreatedAt = DateTime.MinValue // will cause SQL date
>>> failure
>>>
>>>             });
>>>
>>>         }
>>>
>>>         new ForceEscalationToDistributedTx();
>>>
>>>         tx.Complete();
>>>
>>>     }
>>>
>>> }
>>>
>>> The problem is that when we fully escalate to distributed tx, the actual
>>> commit is going to happen on a different thread.
>>> If an exception is thrown by the commit, this is going to crash the
>>> entire process.
>>> Now, my problem is that I am not sure what NH's behavior should be in
>>> this regard, because we don't have a good way of reporting the error to the
>>> user at this point.
>>> I am going to commit a fix that will swallow the exception, force a
>>> rollback on the DTC and log an error.
>>> I am not _happy_ about that, but I can't think of anything that will be
>>> better.
>
>

Reply via email to