使用事务

本文介绍了XPO中显式事务的概念及其实现方式。显式事务能够在数据库级别上为数据操作提供更精细的控制,适合于批量更新场景。文章通过示例代码详细解释了如何使用C#和VB.NET来手动管理显式事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务是逻辑单元,它允许原子地,一致地执行数据操作。在XPO中,可以使用适当的Session方法手动管理常规事务(在XPO级别)和显式事务(在数据库级别)。XPO还提供工作单元,将事务封装到可以完全提交或回滚的功能块中。

使用显式事务

  • 2020年8月24日
  • 3分钟阅读

一个明确的事务表示明确开始了内部的数据库事务会话的UnitOfWork分离并最终确定在数据库级事务变化。显式事务使您可以轻松管理对象更改,并且在常规事务无法用于批处理对象更新的情况下也很方便。

XPO本质启动短明确的交易,只承诺在所做的更改交易到一个数据库,然后自动关闭交易,以避免并发问题。您可以使用Session.ExplicitBeginTransactionSession.ExplicitCommitTransactionSession.ExplicitRollbackTransaction方法手动维护会话或工作单元中的显式事务,如下所示。

using (UnitOfWork uow = new UnitOfWork(session1.DataLayer))
{
    Person person = new Person(uow);
    person.Name = "Thomas Brown";
    person.Age = 33;

    // Starts an explicit transaction.
    uow.ExplicitBeginTransaction();
    try {
        uow.CommitChanges();

        // person has been temporarily stored to a database, thus FindObject locates this person.
        Person savedPerson = uow.FindObject<Person>(CriteriaOperator.Parse(
            "Name = ? And Age = ?", person.Name, person.Age));

        savedPerson.Name = "James Smith";
        savedPerson.Age = 60;

        // Updates person with new data.
        uow.CommitChanges();
        // Finalizes changes and closes the explicit transaction.
        uow.ExplicitCommitTransaction();
    } catch {
        // Rolls back changes and closes the explicit transaction.
        uow.ExplicitRollbackTransaction();
        throw;
    }
}

为了简化显式事务的管理,已实现ExplicitUnitOfWork。在第一次将对象更改临时保存到数据库之前,这些工作单元会自动启动显式事务。还可以自动跟踪中间对象的更改,因此您可以访问已修改的对象,而无需事先提交更改。

下面的代码片段演示了如何使用显式的工作单元来简化上面演示的代码。

using (ExplicitUnitOfWork euow = new ExplicitUnitOfWork(session1.DataLayer)) {
    // Starts tracking changes to persistent objects.
    Person person = new Person(euow);
    person.Name = "Thomas Brown";
    person.Age = 33;

    // Starts an explicit transaction and flushes all intermediate object changes to a database.
    // Thus, person has been temporarily stored to a database and FindObject locates this person.
    Person savedPerson = euow.FindObject<Person>(CriteriaOperator.Parse(
        "Name = ? And Age = ?", person.Name, person.Age));

    savedPerson.Name = "James Smith";
    savedPerson.Age = 60;

    // Updates person with new data and commits the explicit transaction.
    euow.CommitChanges();
}
注意

明确开始交易显式提交事务显式回滚事务方法不能使用显式单位中工作的S,因为他们在适当的时候自动调用。

重要

一个会话单位中的工作是启动明确的事务必须是数据库连接的唯一所有者。因此,一次只能打开一个显式事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值