Back to Devexpress

Session.BeginTransaction() Method

xpo-devexpress-dot-xpo-dot-session-c2ad6a94.md

latest10.5 KB
Original Source

Session.BeginTransaction() Method

Starts a transaction.

Namespace : DevExpress.Xpo

Assembly : DevExpress.Xpo.v25.2.dll

NuGet Package : DevExpress.Xpo

Declaration

csharp
public virtual void BeginTransaction()
vb
Public Overridable Sub BeginTransaction

Remarks

Calling the BeginTransaction method marks the starting point of a transaction - the point at which the data referenced by a session is consistent. All data modifications made after calling this method can be rolled back. This allows data to be returned to this known state of consistency.

Each transaction lasts until either the Session.CommitTransaction (Session.CommitTransactionAsync) or Session.RollbackTransaction method is called. The Session.CommitTransaction or Session.CommitTransactionAsync method commits the modifications. The Session.RollbackTransaction method discards all the changes made.

After the BeginTransaction method is called, the Session.BeforeBeginTransaction event is raised.

Example

The following example demonstrates how to work with transactions.

In this example, the transaction begins when a persistent object is saved. The Session.BeginTransaction method marks the starting point of the transaction. If the value of the persistent object’s Amount property is negative, the Session.RollbackTransaction method is called which completes the transaction discarding all the changes made since the transaction was started.

Otherwise, if the Amount property’s value isn’t negative, the Session.CommitTransaction method is called to complete the transaction and save all the data modifications made.

csharp
using System;
using DevExpress.Xpo;
using DevExpress.Xpo.DB;

namespace ConsoleApplication1 {
    class Account : XPObject {
        public const double DefaultAmount = 100;
        private double amount = DefaultAmount;
        public Account(Session session) : base(session) { }
        public double Amount {
            get { return amount; }
            set { SetPropertyValue<double>(nameof(Amount), ref amount, value); }
        }
        protected override void OnSaving() {
            base.OnSaving();
            if (!IsDeleted) {
                if (Amount < 0) {
                    throw new Exception("Negative amount!");
                }
            }
        }
    }

    class Program {
        static void Main(string[] args) {
            string connectionString = MSSqlConnectionProvider.GetConnectionString("(local)", "ConsoleApplication1");
            XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionString, AutoCreateOption.DatabaseAndSchema);
            TransferAmount(100);
            TransferAmount(200);
            Console.WriteLine("Press <Enter> to exit");
            Console.ReadLine();
        }

        static void TransferAmount(double amount) {
            using (Session session = new Session()) {
                Console.WriteLine("Creating Account1 with amount = " + Account.DefaultAmount);
                Account account1 = new Account(session);
                account1.Save();
                Console.WriteLine("Creating Account2 with amount = " + Account.DefaultAmount);
                Account account2 = new Account(session);
                account2.Save();
                Console.WriteLine("");
                Console.WriteLine("Beginning the transaction...");
                session.BeginTransaction();
                try {
                    Console.WriteLine(String.Format(" Withdrawing {0} from Account1", amount));
                    account1.Amount -= amount;
                    account1.Save();
                    Console.WriteLine(String.Format(" Transferring {0} to Account2", amount));
                    account2.Amount += amount;
                    account2.Save();
                    Console.WriteLine("Committing the transaction...");
                    session.CommitTransaction();
                }
                catch (Exception e) {
                    Console.WriteLine("Exception message: " + e.Message);
                    Console.WriteLine("Rolling back the transaction");
                    session.RollbackTransaction();
                    Console.WriteLine("Reloading the accounts from database...");
                    account1.Reload();
                    account2.Reload();
                }
                Console.WriteLine("Account1 amount: " + account1.Amount);
                Console.WriteLine("Account2 amount: " + account2.Amount);
                Console.WriteLine();
            }
        }
    }
}
vb
Imports System
Imports DevExpress.Xpo
Imports DevExpress.Xpo.DB

Namespace ConsoleApplication1
    Friend Class Account
        Inherits XPObject

        Public Const DefaultAmount As Double = 100
        Private _amount As Double = DefaultAmount
        Public Sub New(ByVal session As Session)
            MyBase.New(session)
        End Sub
        Public Property Amount() As Double
            Get
                Return _amount
            End Get
            Set(ByVal value As Double)
                SetPropertyValue(Of Double)(NameOf(Amount), _amount, value)
            End Set
        End Property
        Protected Overrides Sub OnSaving()
            MyBase.OnSaving()
            If Not IsDeleted Then
                If Amount < 0 Then
                    Throw New Exception("Negative amount!")
                End If
            End If
        End Sub
    End Class

    Friend Class Program
        Shared Sub Main(ByVal args() As String)
            Dim connectionString As String = MSSqlConnectionProvider.GetConnectionString("(local)", "ConsoleApplication1")
            XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionString, AutoCreateOption.DatabaseAndSchema)
            TransferAmount(100)
            TransferAmount(200)
            Console.WriteLine("Press <Enter> to exit")
            Console.ReadLine()
        End Sub

        Private Shared Sub TransferAmount(ByVal amount As Double)
            Using session As New Session()
                Console.WriteLine("Creating Account1 with amount = " & Account.DefaultAmount)
                Dim account1 As New Account(session)
                account1.Save()
                Console.WriteLine("Creating Account2 with amount = " & Account.DefaultAmount)
                Dim account2 As New Account(session)
                account2.Save()
                Console.WriteLine("")
                Console.WriteLine("Beginning the transaction...")
                session.BeginTransaction()
                Try
                    Console.WriteLine(String.Format(" Withdrawing {0} from Account1", amount))
                    account1.Amount -= amount
                    account1.Save()
                    Console.WriteLine(String.Format(" Transferring {0} to Account2", amount))
                    account2.Amount += amount
                    account2.Save()
                    Console.WriteLine("Committing the transaction...")
                    session.CommitTransaction()
                Catch e As Exception
                    Console.WriteLine("Exception message: " & e.Message)
                    Console.WriteLine("Rolling back the transaction")
                    session.RollbackTransaction()
                    Console.WriteLine("Reloading the accounts from database...")
                    account1.Reload()
                    account2.Reload()
                End Try
                Console.WriteLine("Account1 amount: " & account1.Amount)
                Console.WriteLine("Account2 amount: " & account2.Amount)
                Console.WriteLine()
            End Using
        End Sub
    End Class
End Namespace

The following code snippet (auto-collected from DevExpress Examples) contains a reference to the BeginTransaction() method.

Note

The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.

reporting-provide-custom-report-gallery-storage-in-report-designer/CS/XpoReportGalleryStorage/XpoReportGalleryStorageSimple.cs#L13

csharp
using(UnitOfWork unitOfWork = new UnitOfWork(DataLayer)) {
    unitOfWork.BeginTransaction();
    var deletedItems = unitOfWork.Query<ReportGalleryTable>().Select(a => a);

reporting-provide-custom-report-gallery-storage-in-report-designer/VB/XpoReportGalleryStorage/XpoReportGalleryStorageSimple.vb#L20

vb
Using unitOfWork As UnitOfWork = New UnitOfWork(DataLayer)
    unitOfWork.BeginTransaction()
    Dim deletedItems = unitOfWork.Query(Of ReportGalleryTable)().[Select](Function(a) a)

See Also

CommitTransaction()

CommitTransactionAsync

RollbackTransaction()

ExplicitBeginTransaction

Session Class

Session Members

DevExpress.Xpo Namespace