Skip to content

Commit c042369

Browse files
committed
fixed issue with implicit transaction not committing changes
1 parent 371fef3 commit c042369

File tree

1 file changed

+31
-60
lines changed

1 file changed

+31
-60
lines changed

Source/Persistence/Adapters/Spring.Persistence.Adapters.UIB.pas

+31-60
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,9 @@ EUIBAdapterException = class(EORMAdapterException);
4747
/// Represents Unified Interbase resultset.
4848
/// </summary>
4949
TUIBResultSetAdapter = class(TDriverResultSetAdapter<TUIBDataSet>)
50-
private
51-
fIsNewTransaction: Boolean;
5250
public
5351
constructor Create(const dataSet: TUIBDataSet;
5452
const exceptionHandler: IORMExceptionHandler);
55-
destructor Destroy; override;
56-
57-
property IsNewTransaction: Boolean read fIsNewTransaction write fIsNewTransaction;
5853
end;
5954

6055
/// <summary>
@@ -126,17 +121,10 @@ implementation
126121
constructor TUIBResultSetAdapter.Create(const dataSet: TUIBDataSet;
127122
const exceptionHandler: IORMExceptionHandler);
128123
begin
129-
Dataset.OnClose := etmStayIn;
124+
dataset.OnClose := etmStayIn;
130125
inherited Create(dataSet, exceptionHandler);
131126
end;
132127

133-
destructor TUIBResultSetAdapter.Destroy;
134-
begin
135-
if fIsNewTransaction then
136-
DataSet.Transaction.Free;
137-
inherited;
138-
end;
139-
140128
{$ENDREGION}
141129

142130

@@ -163,7 +151,10 @@ function TUIBStatementAdapter.Execute: NativeUInt;
163151
Statement.Prepare;
164152
Statement.ExecSQL;
165153
Result := Statement.RowsAffected;
166-
Statement.Close(etmStayIn);
154+
if Statement.Transaction = Statement.DataBase.Transactions[0] then
155+
Statement.Close(etmCommit)
156+
else
157+
Statement.Close(etmStayIn);
167158
except
168159
raise HandleException;
169160
end;
@@ -172,39 +163,24 @@ function TUIBStatementAdapter.Execute: NativeUInt;
172163
function TUIBStatementAdapter.ExecuteQuery(serverSideCursor: Boolean): IDBResultSet;
173164
var
174165
query: TUIBDataSet;
175-
isNewTransaction: Boolean;
176-
transaction: TUIBTransaction;
177166
adapter: TUIBResultSetAdapter;
178167
begin
179168
inherited;
180169
query := TUIBDataSet.Create(nil);
181-
isNewTransaction := Statement.DataBase.TransactionsCount < 1;
182-
if not isNewTransaction then
183-
transaction := Statement.DataBase.Transactions[0]
184-
else
185-
begin
186-
transaction := TUIBTransaction.Create(nil);
187-
transaction.DefaultAction := etmRollback;
188-
transaction.DataBase := Statement.DataBase;
189-
end;
190-
transaction.DefaultAction := etmRollback;
191-
query.DisableControls;
192-
query.Transaction := transaction;
193170
query.Database := Statement.DataBase;
171+
query.Transaction := Statement.Transaction;
172+
query.DisableControls;
194173
query.UniDirectional := True;
195174
query.SQL.Text := Statement.SQL.Text;
196175
AssignParams(Statement.Params, query.Params);
197176
try
198177
query.Open;
199178
adapter := TUIBResultSetAdapter.Create(query, ExceptionHandler);
200-
adapter.IsNewTransaction := isNewTransaction;
201179
Result := adapter;
202180
except
203181
on E: Exception do
204182
begin
205183
query.Free;
206-
if isNewTransaction then
207-
transaction.Free;
208184
raise HandleException(Format(SCannotOpenQuery, [E.Message]));
209185
end;
210186
end;
@@ -238,15 +214,25 @@ procedure TUIBStatementAdapter.SetSQLCommand(const commandText: string);
238214

239215
{$REGION 'TUIBConnectionAdapter'}
240216

217+
constructor TUIBConnectionAdapter.Create(const connection: TUIBDataBase);
218+
var
219+
transaction: TUIBTransaction;
220+
begin
221+
Create(connection, TUIBExceptionHandler.Create);
222+
if connection.TransactionsCount = 0 then
223+
begin
224+
transaction := TUIBTransaction.Create(nil);
225+
transaction.DataBase := connection;
226+
end;
227+
end;
228+
241229
destructor TUIBConnectionAdapter.Destroy;
242230
var
243231
i: Integer;
244232
begin
245233
if Assigned(Connection) then
246-
begin
247-
for i := 0 to Connection.TransactionsCount - 1 do
234+
for i := Connection.TransactionsCount - 1 downto 0 do
248235
Connection.Transactions[i].Free;
249-
end;
250236
inherited Destroy;
251237
end;
252238

@@ -287,31 +273,16 @@ procedure TUIBConnectionAdapter.Connect;
287273
end;
288274
end;
289275

290-
constructor TUIBConnectionAdapter.Create(const connection: TUIBDataBase);
291-
begin
292-
Create(connection, TUIBExceptionHandler.Create);
293-
end;
294-
295276
function TUIBConnectionAdapter.CreateStatement: IDBStatement;
296277
var
297278
statement: TUIBStatement;
298-
transaction: TUIBTransaction;
299279
adapter: TUIBStatementAdapter;
300280
begin
301281
if Assigned(Connection) then
302282
begin
303283
statement := TUIBStatement.Create(nil);
304-
if Connection.TransactionsCount > 0 then
305-
transaction := Connection.Transactions[Connection.TransactionsCount - 1]
306-
else
307-
begin
308-
transaction := TUIBTransaction.Create(nil);
309-
transaction.DefaultAction := etmRollback;
310-
transaction.DataBase := Connection;
311-
end;
312-
313284
statement.DataBase := Connection;
314-
statement.Transaction := transaction;
285+
statement.Transaction := Connection.Transactions[Connection.TransactionsCount - 1];
315286

316287
adapter := TUIBStatementAdapter.Create(statement, ExceptionHandler);
317288
adapter.ExecutionListeners := ExecutionListeners;
@@ -341,16 +312,6 @@ function TUIBConnectionAdapter.IsConnected: Boolean;
341312

342313
{$REGION 'TUIBTransactionAdapter'}
343314

344-
procedure TUIBTransactionAdapter.Commit;
345-
begin
346-
if Assigned(fTransaction) then
347-
try
348-
fTransaction.Commit;
349-
except
350-
raise HandleException;
351-
end;
352-
end;
353-
354315
constructor TUIBTransactionAdapter.Create(const transaction: TUIBTransaction;
355316
const exceptionHandler: IORMExceptionHandler);
356317
begin
@@ -370,6 +331,16 @@ destructor TUIBTransactionAdapter.Destroy;
370331
inherited Destroy;
371332
end;
372333

334+
procedure TUIBTransactionAdapter.Commit;
335+
begin
336+
if Assigned(fTransaction) then
337+
try
338+
fTransaction.Commit;
339+
except
340+
raise HandleException;
341+
end;
342+
end;
343+
373344
function TUIBTransactionAdapter.InTransaction: Boolean;
374345
begin
375346
Result := fTransaction.InTransaction;

0 commit comments

Comments
 (0)