SqlTransactionManager.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System.Data;
  2. using Vitorm.Sql;
  3. using Vitorm.Sql.Transaction;
  4. using Vitorm.Transaction;
  5. using SqlTransaction = Microsoft.Data.Sqlite.SqliteTransaction;
  6. namespace Vitorm.Sqlite
  7. {
  8. // sqlite/transactions https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/transactions
  9. public class SqlTransactionManager : Vitorm.Sql.Transaction.SqlTransactionManager
  10. {
  11. int savePointCount = 0;
  12. public Sql.Transaction.SqlTransaction CreateTransactionSavePoint(IDbTransaction originalTransaction)
  13. {
  14. var savePointName = "tran" + savePointCount++;
  15. return new TransactionSavePoint(originalTransaction, savePointName);
  16. }
  17. public SqlTransactionManager(SqlDbContext dbContext) : base(dbContext)
  18. {
  19. }
  20. public override ITransaction BeginTransaction()
  21. {
  22. Sql.Transaction.SqlTransaction transaction;
  23. IDbTransaction originalTransaction = GetDbTransaction();
  24. if (originalTransaction == null)
  25. {
  26. var dbConnection = dbContext.dbConnection;
  27. if (dbConnection.State != ConnectionState.Open) dbConnection.Open();
  28. originalTransaction = dbConnection.BeginTransaction();
  29. transaction = new Sql.Transaction.SqlTransaction(originalTransaction);
  30. }
  31. else
  32. {
  33. transaction = CreateTransactionSavePoint(originalTransaction);
  34. }
  35. transactions.Push(transaction);
  36. return transaction;
  37. }
  38. }
  39. public class TransactionSavePoint : Sql.Transaction.SqlTransaction
  40. {
  41. public SqlTransaction sqlTran => (SqlTransaction)originalTransaction;
  42. readonly string savePointName;
  43. public TransactionSavePoint(IDbTransaction transaction, string savePointName) : base(transaction)
  44. {
  45. this.savePointName = savePointName;
  46. sqlTran.Save(savePointName);
  47. }
  48. public override void Commit()
  49. {
  50. sqlTran.Release(savePointName);
  51. TransactionState = ETransactionState.Committed;
  52. }
  53. public override void Dispose()
  54. {
  55. if (TransactionState == ETransactionState.Active)
  56. sqlTran.Rollback(savePointName);
  57. TransactionState = ETransactionState.Disposed;
  58. }
  59. public override void Rollback()
  60. {
  61. sqlTran.Rollback(savePointName);
  62. TransactionState = ETransactionState.RolledBack;
  63. }
  64. }
  65. }