# 事务管理

介绍

在对 Revit 文档进行修改的时候,需要开启一个文档才可以进行!本文主要介绍扩展包对三种事务类型的扩展。

# 事务(Transaction)

事务,用于提交对文档的修改。

TransactionResult result = document.NewTransaction(()=>
{
    //todo 执行其他的业务代码
    Line line = Line.CreateBound(XYZ.Zero, XYZ.Zero + new XYZ(0, 10, 0));
    document.Create.NewDetailCurve(uiDocument.ActiveGraphicalView, line);

    //如果需要对事务进行回滚,扩展包提供了友好的异常,只要直接抛出就可以回滚;
    throw new TransactionRollbackException();
} , "事务的名称")

如果需要对事务的故障进行处理,可以对委托的参数进行配置,如下:

TransactionResult result = document.NewTransaction((options)=>
{
    options.SetForcedModalHandling(true);

    //todo 执行其他的业务代码
} , "事务的名称")

# 子事务(SubTransaction)

子事务,用于在事务中对文档的局部修改进行提交

TransactionResult result = document.NewSubtransaction(()=>
{
    //todo 执行其他的业务代码
    Line line = Line.CreateBound(XYZ.Zero, XYZ.Zero + new XYZ(0, 10, 0));
    document.Create.NewDetailCurve(uiDocument.ActiveGraphicalView, line);

    //如果需要对事务进行回滚,扩展包提供了友好的异常,只要直接抛出就可以回滚;
    throw new TransactionRollbackException();
})

# 事务组(TransactionGroup)

事务组,用于将所有事务打包,统一管理事务的提交或者回滚;同事,事务组还提供合并事务的功能,这样做的好处是在历史记录中仅保留一条记录;

TransactionResult result = document.NewTransactionGroup(()=>
{
    document.NewTransaction(() =>
    {
        //to do
    });

    //如果需要对事务进行回滚,扩展包提供了友好的异常,只要直接抛出就可以回滚;
    throw new TransactionRollbackException();
} , "事务组的名称")

在上一个无参的事务组方法中,默认对所有事务进行合并;如果希望事务在撤销列表是分开的,可以调用 options 参数的委托 ;

TransactionResult result = document.NewTransactionGroup((options)=>
{
    document.NewTransaction(() =>
    {
        //to do
    });

    //如果需要对事务进行回滚,扩展包提供了友好的异常,只要直接抛出就可以回滚;
    throw new TransactionRollbackException();
})

# 事务返回值

在扩展包里,所有的事务类型都提供了返回值,扩展方法会对事务内可能发生的异常进行预处理,如果需要对事务的执行结果进行更多业务上的判断,可以获取事务结果,并执行相关的操作

TransactionResult result = document.NewTransaction(()=>{ //todo });

if(result.TransactionStatus == TransactionStatus.Rollback)
{
    //当事务回滚的时候
}

if(result.HasException)
{
    //当事务存在异常的时候
    Exception exception = result.Exception
}