附录2. Transactions(事务处理)

愿你出走半生,归来仍是少年! 

目录

1. 如何创建

2. 提交或终止

2.1 提交

2.2 终止

3. 对象获取

4. 嵌套


 

        在Object Arx开发中,涉及到对对象的编辑、创建时,事务处理是不可或缺的一部分基础工。 

        当使用事务时,您可以决定何时将对象的更改保存到绘图数据库。可以使用Commit方法保存对事务中打开的对象所做的更改。如果程序遇到错误,可以使用Abort方法回滚事务中所做的任何更改。

        如果在调用Dispose之前没有调用Commit,则会回滚事务中所做的所有更改。无论调用Commit还是Abort,都需要调用Dispose来发出事务结束的信号。如果事务对象以Using语句启动,则不必调用Dispose。

1. 如何创建

// 获取当前的文档 
Document doc = Application.DocumentManager.MdiActiveDocument;

// 获取库
Database db = doc.Database;

//获取编辑器
Editor editor = Application.DocumentManager.MdiActiveDocument.Editor;

using (Transaction trans = db.TransactionManager.StartTransaction())
{

}

2. 提交或终止

2.1 提交

         通过Transaction类的Commit方法,可提交在事务期间打开的所有DBObjects中所做的更改,然后关闭它们。

public virtual void Commit();

2.2 终止

         通过Transaction类的Abort方法,可终止事务。

public virtual void Abort();

        事务正常运行到最后时都用进行提交,若未执行Commit()那么事务释放后会自动回滚之前的是事务操作,代表白做了那些操作。

3. 对象获取

        通过Transaction类的GetObject方法,可获取到对象。

public virtual DBObject GetObject(
    ObjectId id, 
    Autodesk.AutoCAD.DatabaseServices.OpenMode mode
);

        其中id代表对象在CAD中ID,mode代表打开方式。通常在前面使用OpenMode.ForRead,后面需要进行编辑时通过DbObjectUpgradeOpen()方法进行权限提升,变更为编辑。可参考4. 图层操作(持续更新)_就是那个帕吉的博客-CSDN博客中针对图层记录对象那里的代码进行理解。

4. 嵌套

        事务可以一个嵌套在另一个事务中。在实际开发中可能有一个外部事务来撤消例程所做的所有更改,而内部事务只撤消所做更改的一部分。当使用嵌套事务时,从一个顶级事务开始,它也是最外层的事务。

        当启动新事务时,它们将被添加到前一个事务中。嵌套事务必须按照与它们创建顺序相反的顺序提交或终止。因此,如果有三个事务,必须在第二个和最后一个事务之前关闭第三个或最里面的一个事务。如果中止了第一个事务,那么所有三个事务所做的更改都将撤消。

        下图显示嵌套时事务的显示方式:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Redux-Toolkit中,可以使用Immer库轻松地实现对象的合并。您可以使用`createSlice`函数的`reducers`字段来定义一个reducer,然后使用Immer库中的`produce`函数来修改状态。以下是一个示例代码: ```javascript import { createSlice } from '@reduxjs/toolkit'; import produce from 'immer'; const transactionsSlice = createSlice({ name: 'transactions', initialState: { transactions: [], }, reducers: { mergeTransactions: (state, action) => { const { oldTransaction, newTransaction } = action.payload; state.transactions = produce(state.transactions, draftState => { const oldIndex = draftState.findIndex(t => t.id === oldTransaction.id); if (oldIndex !== -1) { draftState[oldIndex] = { ...oldTransaction, ...newTransaction }; } }); }, }, }); export const { mergeTransactions } = transactionsSlice.actions; export default transactionsSlice.reducer; ``` 在上面的代码中,我们定义了一个名为`mergeTransactions`的reducer,它接受一个包含旧事务和新事务的payload。我们使用Immer库中的`produce`函数来修改`state.transactions`数组,并使用`Array.findIndex`方法找到旧事务的索引。如果找到了旧事务,我们使用对象展开语法将旧事务与新事务合并,并将其设置为数组中的新对象。 您可以将这个reducer与其他reducer一起使用,以便在应用程序中对状态进行更改。例如,您可以在组件中调用`dispatch(mergeTransactions({ oldTransaction, newTransaction }))`来触发此reducer并合并旧对象和新对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是那个帕吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值