欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用事务2

程序员文章站 2022-07-07 10:40:16
...

使用事务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");
}
相关标签: XPO