Skip to content

Commit 8e0b67b

Browse files
committed
Add the async transaction related storage driver operations
1 parent dd62a43 commit 8e0b67b

1 file changed

Lines changed: 104 additions & 5 deletions

File tree

Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs

Lines changed: 104 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,7 @@ public void BeginTransaction(Session session, SqlConnection connection, Isolatio
195195
isolationLevel);
196196
}
197197

198-
if (isolationLevel == null) {
199-
isolationLevel = IsolationLevelConverter.Convert(GetConfiguration(session).DefaultIsolationLevel);
200-
}
198+
isolationLevel ??= IsolationLevelConverter.Convert(GetConfiguration(session).DefaultIsolationLevel);
201199

202200
try {
203201
connection.BeginTransaction(isolationLevel.Value);
@@ -207,6 +205,24 @@ public void BeginTransaction(Session session, SqlConnection connection, Isolatio
207205
}
208206
}
209207

208+
public async ValueTask BeginTransactionAsync(
209+
Session session, SqlConnection connection, IsolationLevel? isolationLevel, CancellationToken token = default)
210+
{
211+
if (isLoggingEnabled) {
212+
SqlLog.Info(Strings.LogSessionXBeginningTransactionWithYIsolationLevel, session.ToStringSafely(),
213+
isolationLevel);
214+
}
215+
216+
isolationLevel ??= IsolationLevelConverter.Convert(GetConfiguration(session).DefaultIsolationLevel);
217+
218+
try {
219+
await connection.BeginTransactionAsync(isolationLevel.Value, token).ConfigureAwait(false);
220+
}
221+
catch (Exception exception) {
222+
throw ExceptionBuilder.BuildException(exception);
223+
}
224+
}
225+
210226
public void CommitTransaction(Session session, SqlConnection connection)
211227
{
212228
if (isLoggingEnabled) {
@@ -221,6 +237,21 @@ public void CommitTransaction(Session session, SqlConnection connection)
221237
}
222238
}
223239

240+
public async ValueTask CommitTransactionAsync(
241+
Session session, SqlConnection connection, CancellationToken token = default)
242+
{
243+
if (isLoggingEnabled) {
244+
SqlLog.Info(Strings.LogSessionXCommitTransaction, session.ToStringSafely());
245+
}
246+
247+
try {
248+
await connection.CommitAsync(token).ConfigureAwait(false);
249+
}
250+
catch (Exception exception) {
251+
throw ExceptionBuilder.BuildException(exception);
252+
}
253+
}
254+
224255
public void RollbackTransaction(Session session, SqlConnection connection)
225256
{
226257
if (isLoggingEnabled) {
@@ -235,14 +266,29 @@ public void RollbackTransaction(Session session, SqlConnection connection)
235266
}
236267
}
237268

269+
public async ValueTask RollbackTransactionAsync(
270+
Session session, SqlConnection connection, CancellationToken token = default)
271+
{
272+
if (isLoggingEnabled) {
273+
SqlLog.Info(Strings.LogSessionXRollbackTransaction, session.ToStringSafely());
274+
}
275+
276+
try {
277+
await connection.RollbackAsync(token).ConfigureAwait(false);
278+
}
279+
catch (Exception exception) {
280+
throw ExceptionBuilder.BuildException(exception);
281+
}
282+
}
283+
238284
public void MakeSavepoint(Session session, SqlConnection connection, string name)
239285
{
240286
if (isLoggingEnabled) {
241287
SqlLog.Info(Strings.LogSessionXMakeSavepointY, session.ToStringSafely(), name);
242288
}
243289

244290
if (!hasSavepoints) {
245-
return; // Driver does not support savepoints, so let's fail later (on rollback)
291+
return; // Driver does not support save points, so let's fail later (on rollback)
246292
}
247293

248294
try {
@@ -253,6 +299,25 @@ public void MakeSavepoint(Session session, SqlConnection connection, string name
253299
}
254300
}
255301

302+
public async ValueTask MakeSavepointAsync(
303+
Session session, SqlConnection connection, string name, CancellationToken token = default)
304+
{
305+
if (isLoggingEnabled) {
306+
SqlLog.Info(Strings.LogSessionXMakeSavepointY, session.ToStringSafely(), name);
307+
}
308+
309+
if (!hasSavepoints) {
310+
return; // Driver does not support save points, so let's fail later (on rollback)
311+
}
312+
313+
try {
314+
await connection.MakeSavepointAsync(name, token).ConfigureAwait(false);
315+
}
316+
catch (Exception exception) {
317+
throw ExceptionBuilder.BuildException(exception);
318+
}
319+
}
320+
256321
public void RollbackToSavepoint(Session session, SqlConnection connection, string name)
257322
{
258323
if (isLoggingEnabled) {
@@ -270,7 +335,26 @@ public void RollbackToSavepoint(Session session, SqlConnection connection, strin
270335
throw ExceptionBuilder.BuildException(exception);
271336
}
272337
}
273-
338+
339+
public async ValueTask RollbackToSavepointAsync(
340+
Session session, SqlConnection connection, string name, CancellationToken token = default)
341+
{
342+
if (isLoggingEnabled) {
343+
SqlLog.Info(Strings.LogSessionXRollbackToSavepointY, session.ToStringSafely(), name);
344+
}
345+
346+
if (!hasSavepoints) {
347+
throw new NotSupportedException(Strings.ExCurrentStorageProviderDoesNotSupportSavepoints);
348+
}
349+
350+
try {
351+
await connection.RollbackToSavepointAsync(name, token).ConfigureAwait(false);
352+
}
353+
catch (Exception exception) {
354+
throw ExceptionBuilder.BuildException(exception);
355+
}
356+
}
357+
274358
public void ReleaseSavepoint(Session session, SqlConnection connection, string name)
275359
{
276360
if (isLoggingEnabled) {
@@ -285,6 +369,21 @@ public void ReleaseSavepoint(Session session, SqlConnection connection, string n
285369
}
286370
}
287371

372+
public async ValueTask ReleaseSavepointAsync(
373+
Session session, SqlConnection connection, string name, CancellationToken token = default)
374+
{
375+
if (isLoggingEnabled) {
376+
SqlLog.Info(Strings.LogSessionXReleaseSavepointY, session.ToStringSafely(), name);
377+
}
378+
379+
try {
380+
await connection.ReleaseSavepointAsync(name, token).ConfigureAwait(false);
381+
}
382+
catch (Exception exception) {
383+
throw ExceptionBuilder.BuildException(exception);
384+
}
385+
}
386+
288387
#region Sync Execute methods
289388

290389
public int ExecuteNonQuery(Session session, DbCommand command) =>

0 commit comments

Comments
 (0)