1
1
using System ;
2
2
using System . Data ;
3
+ using Antlr . Runtime ;
3
4
using Antlr . Runtime . Tree ;
4
5
using NHibernate . Action ;
6
+ using NHibernate . AdoNet . Util ;
5
7
using NHibernate . Engine ;
6
8
using NHibernate . Engine . Transaction ;
7
9
using NHibernate . Event ;
8
10
using NHibernate . Hql . Ast . ANTLR . Tree ;
9
11
using NHibernate . Persister . Entity ;
10
12
using NHibernate . SqlCommand ;
11
-
12
- using Antlr . Runtime ;
13
13
using NHibernate . SqlTypes ;
14
+ using NHibernate . Transaction ;
14
15
using NHibernate . Util ;
15
- using NHibernate . AdoNet . Util ;
16
16
17
17
namespace NHibernate . Hql . Ast . ANTLR . Exec
18
18
{
@@ -142,9 +142,12 @@ protected virtual void CreateTemporaryTableIfNecessary(IQueryable persister, ISe
142
142
}
143
143
else
144
144
{
145
- work . DoWork ( session . ConnectionManager . GetConnection ( ) , null ) ;
146
- session . ConnectionManager . AfterStatement ( ) ;
147
- }
145
+ using ( var dummyCommand = session . ConnectionManager . CreateCommand ( ) )
146
+ {
147
+ work . DoWork ( dummyCommand . Connection , dummyCommand . Transaction ) ;
148
+ session . ConnectionManager . AfterStatement ( ) ;
149
+ }
150
+ }
148
151
}
149
152
150
153
protected virtual bool ShouldIsolateTemporaryTableDDL ( )
@@ -165,21 +168,27 @@ protected virtual void DropTemporaryTableIfNecessary(IQueryable persister, ISess
165
168
166
169
if ( ShouldIsolateTemporaryTableDDL ( ) )
167
170
{
168
- if ( Factory . Settings . IsDataDefinitionInTransactionSupported )
169
- {
170
- Isolater . DoIsolatedWork ( work , session ) ;
171
- }
172
- else
173
- {
174
- Isolater . DoNonTransactedWork ( work , session ) ;
175
- }
176
- }
177
- else
178
- {
179
- work . DoWork ( session . ConnectionManager . GetConnection ( ) , null ) ;
180
- session . ConnectionManager . AfterStatement ( ) ;
181
- }
182
- }
171
+ session . ConnectionManager . Transaction . RegisterSynchronization ( new AfterTransactionCompletes ( ( success ) =>
172
+ {
173
+ if ( Factory . Settings . IsDataDefinitionInTransactionSupported )
174
+ {
175
+ Isolater . DoIsolatedWork ( work , session ) ;
176
+ }
177
+ else
178
+ {
179
+ Isolater . DoNonTransactedWork ( work , session ) ;
180
+ }
181
+ } ) ) ;
182
+ }
183
+ else
184
+ {
185
+ using ( var sillyCommand = session . ConnectionManager . CreateCommand ( ) )
186
+ {
187
+ work . DoWork ( sillyCommand . Connection , sillyCommand . Transaction ) ;
188
+ session . ConnectionManager . AfterStatement ( ) ;
189
+ }
190
+ }
191
+ }
183
192
else
184
193
{
185
194
// at the very least cleanup the data :)
@@ -229,7 +238,8 @@ public void DoWork(IDbConnection connection, IDbTransaction transaction)
229
238
IDbCommand stmnt = null ;
230
239
try
231
240
{
232
- stmnt = session . ConnectionManager . CreateCommand ( ) ;
241
+ stmnt = connection . CreateCommand ( ) ;
242
+ stmnt . Transaction = transaction ;
233
243
stmnt . CommandText = persister . TemporaryIdTableDDL ;
234
244
stmnt . ExecuteNonQuery ( ) ;
235
245
session . Factory . Settings . SqlStatementLogger . LogCommand ( stmnt , FormatStyle . Ddl ) ;
@@ -273,7 +283,8 @@ public void DoWork(IDbConnection connection, IDbTransaction transaction)
273
283
IDbCommand stmnt = null ;
274
284
try
275
285
{
276
- stmnt = session . ConnectionManager . CreateCommand ( ) ;
286
+ stmnt = connection . CreateCommand ( ) ;
287
+ stmnt . Transaction = transaction ;
277
288
stmnt . CommandText = "drop table " + persister . TemporaryIdTableName ;
278
289
stmnt . ExecuteNonQuery ( ) ;
279
290
session . Factory . Settings . SqlStatementLogger . LogCommand ( stmnt , FormatStyle . Ddl ) ;
0 commit comments