一、概述
- “事务”这一术语指的是在 EPLAN 项目数据库中构成一个工作单元的一系列操作。这些操作必须全部一起执行,不能单独执行任何一个。这种分组方式能够确保数据的完整性和一致性,即便在系统出现故障的情况下也是如此。例如:
using (Transaction oTransaction = new TransactionManager().CreateTransaction())
{
oFunction1.Name = "=+-NewTestFunctionName_1";
oFunction2.Name = "=+-NewTestFunctionName_2";
oTransaction.Commit();
}
- 因此,如果在调用“Commit()”之前代码的执行就被中断了,那么“Name”属性的值将保持不变。
二、嵌套 API 交易
- 在 API 中也可以嵌套多个事务。例如:
oFunction.Name = "oFunction0";
using (Transaction oTransaction1 = new TransactionManager().CreateTransaction())
{
using(Transaction oTransaction2 = new TransactionManager().CreateTransaction())
{
oFunction.Name = "Function2";
oTransaction2.Commit();
}
Console.Writeline(oFunction.Name) // Will be "oFunction2" returned,
oFunction.Name = "Function1";
Console.Writeline(oFunction.Name) // Will be "oFunction1" returned,
}
Console.Writeline(oFunction.Name) // Will be "oFunction0" returned, because outer transaction oTransaction1 wasn't committed
在这种情况下,内部事务会被视为外部事务的操作之一。
三、内部 EPLAN 和 API 交易
- 我们区分了两种类型的交易:
- API 交易 - 它们可以通过显式或隐式的方式从 API 中开启。显式开启是通过从“交易管理器”创建“交易”对象来实现的:
Transaction oTransaction = new TransactionManager().CreateTransaction();
- 隐式打开是通过某些 EPLAN 操作(如创建新对象、更改属性)来创建相同的“事务”对象实现的,这种方式对于 API 用户来说是不可见的。
- EPLAN 内部交易 - 它们是在 EPLAN 框架内部启动的,因此其开启和关闭是自动完成的。
四、同时使用 API 交易和内部交易
同时使用 API 交易和内部交易可能会引发问题。因此,请遵循以下规则以避免此类情况发生:
1、内部交易中的 API 交易操作
- API 事务总是可以嵌套在内部事务中开启的。API 开发者可以通过以下属性来检查 API 事务是否已开启:
TransactionManager::IsTransactionRunning
- 一次 API 事务的提交不会对数据库产生任何更改,并且在内部事务终止之前不会被保存到数据库中。而中止一个 API 事务并不会中止内部事务,而是会抛出异常,因为内部事务正在运行,无法被中止。
2、API 交易内部的一项交易操作
- 内部事务可以始终在 API 事务中开启。API 开发者可以通过以下属性来检查是否已开启内部事务:
TransactionManager::IsEplanTransactionRunning
- 如果要开启内部事务,则 API 事务将被提交。如果再次关闭内部事务(使用“Abort”或“Commit”操作),那么 API 事务将重新启动。API 事务类还具有一个属性,用于指示在 API 事务中是否曾开启和关闭过内部事务:
Transaction::IsImplicitEplanTransactionCommited