使用事务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");
}
上一篇: springboot怎么使用事务
下一篇: react进阶--重读文档教程一