runInXaTransaction<T extends Object> method
Future<Result<T> >
runInXaTransaction<T extends Object>(})
Implementation
Future<Result<T>> runInXaTransaction<T extends Object>(
String connectionId,
Xid xid,
Future<Result<T>> Function(XaTransactionHandle xa) action, {
bool onePhase = false,
}) async {
final startResult = await _repository.xaStart(connectionId, xid);
if (startResult.isError()) {
return Failure(startResult.exceptionOrNull()!);
}
final xa = startResult.getOrNull()!;
if (onePhase) {
try {
final userResult = await action(xa);
if (userResult.isError()) {
await _xaSafelyAbort(xa);
return userResult;
}
if (!xa.commitOnePhase()) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: xa_commit_one_phase failed '
'on xid=${xa.xid}',
),
);
}
return userResult;
} on Object catch (e, st) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: action threw ${e.runtimeType}: '
'$e\n$st',
),
);
}
}
try {
final userResult = await action(xa);
if (userResult.isError()) {
await _xaSafelyAbort(xa);
return userResult;
}
if (!xa.end()) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: xa_end failed on xid=${xa.xid}',
),
);
}
if (!xa.prepare()) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: xa_prepare failed on xid=${xa.xid}',
),
);
}
if (!xa.commitPrepared()) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: xa_commit_prepared failed '
'on xid=${xa.xid}',
),
);
}
return userResult;
} on Object catch (e, st) {
await _xaSafelyAbort(xa);
return Failure(
QueryError(
message: 'runInXaTransaction: action threw ${e.runtimeType}: '
'$e\n$st',
),
);
}
}