使用事务2

使用事务2

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

事务是一组顺序的操作操作,就像是一个工作单元一样执行。换句话说,除非组中的每个单独操作成功,否则交易将永远不会完成。如果事务中的任何操作失败,则整个事务将失败。

事务具有以下四个标准属性(ACID属性)。

  • 原子性:确保工作单元内的所有操作均成功完成;否则,以前的操作将回滚到以前的状态。
  • 一致性:要求保留事务绑定的数据的语义。
  • 隔离:单个事务的结果必须对任何其他未完成的事务透明,直到该事务成功提交为止。
  • 耐用性:确保在系统故障的情况下持久化已提交事务的结果或效果。

在XPO中,可以在XPO级别(常规事务)和数据库级别(显式事务)使用事务。本文档介绍了使用常规交易的方式。要了解显式事务,请参阅使用显式事务

管理交易

要启动常规交易,请调用会话的Session.BeginTransaction方法。如果使用UnitOfWork,事务将自动启动。

注意

即使您没有明确启动事务,XPO也会自动启动事务并提交它们以执行持久性对象操作,例如保存或删除对象。此过程不需要您的干预,但仍会导致所有与事务相关的事件,例如Session。提交失败的提交事务

成功完成事务后,应发出COMMIT命令,以使对所有涉及的持久对象的更改生效。为此,请调用Session.CommitTransaction方法。如果发生故障,则应发出ROLLBACK命令以使事务中的每个持久对象返回其先前状态。在这种情况下,必须使用Session.RollbackTransaction方法。它会完成事务,并丢弃自事务启动以来所做的所有更改。

通常,这些方法在这样的代码中使用:

...
using (Session session = new Session()) {
    session.BeginTransaction();
    try {
        // Create, update or delete objects
        session.CommitTransaction();
    }
    catch {
        session.RollbackTransaction();
        throw;
    }
}
...

由于XPO级别的事务(常规事务)不对应于数据库级别的事务显式事务),因此在XPO中可以长时间运行常规事务,而不会在多用户使用案例中引发并发问题。仅当提交事务时,才会启动简短的数据库事务以应用更改。

若要查看事务是否正在进行,请使用Session.InTransaction属性。

隔离

当事务正在运行并且其中有未提交的更改时-请记住,事务也是UnitOfWork的基础,并且不对应于数据库事务-新建的XPCollection通常将无法“查看”已在其中进行的更改当前交易。这是因为该集合从数据库中获取其内容,但是更改尚未写入那里。这是默认行为;我们引入了一个名为PersistentCriteriaEvaluationBehavior的标志,该标志使您可以查看数据的合并状态,其中已包含当前运行事务的更改。

请参见下面的代码。默认集合(内部使用枚举值PersistentCriteriaEvaluationBehavior.BeforeTransaction内部)不会看到新创建的对象,而具有指定行为PersistentCriteriaEvaluationBehavior.InTransaction的集合将同时查找旧对象和新对象。

// Clear the database and create one object.
using (Session session = new Session()) {
    session.ClearDatabase();
    new Person(session, "Willy Watt").Save();
}

using (UnitOfWork unitOfWork = new UnitOfWork()) {
    // Create a second object.
    Person person = new Person(unitOfWork, "Billy Bott");
    person.Save();

    XPCollection<Person> people = new XPCollection<Person>(unitOfWork);
    // This collection does not see the new object.
    Debug.Assert(people.Count == 1, "Wrong count");

    people = new XPCollection<Person>(PersistentCriteriaEvaluationBehavior.InTransaction, 
      unitOfWork, null);
    // This collection sees both objects.
    Debug.Assert(people.Count == 2, "Wrong count");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值