CAD.NET二次开发过程中的记录——关于事务管理器的问题
简介
CAD的Database与数据库的操作基本相同:
DWG文件-------Database----------数据库
事务常用的操作方法:
开启事务--------------------------------------------Database.TransactionManager.StartTransaction()
获取数据库顶部开启的事务--------------------Database.TransactionManager.TopTransaction
添加事务更新--------------------------------------AddNewlyCreatedDBObject()
事务提交--------------------------------------------commit()
查询
- 开启事务
- 打开对象
- 销毁事务--Using语句不用手动销毁
修改
- 开启事务
- 打开对象
- 提交事务
- 销毁事务--Using语句不用手动销毁
增加
- 开启事务
- 添加对象
- 添加事务更新
- 提交事务
- 销毁事务--Using语句不用手动销毁
删除
- 开启事务
- 打开对象
- 删除对象
- 提交事务
- 销毁事务--Using语句不用手动销毁
事务的嵌套
事务的嵌套(事务的嵌套是指在一个事务的边界当中嵌入另一个事务,事务管理器会将事务保存在堆栈中,最近的事务在堆栈顶部可以通过 TransactionManager.TopTransaction()方法获得)
- 里层的事务可以使用外层事务打开的对象
- 如果最里层的事务终止了,则在此事务内的所有对象操作将取消,对象返回到此事务开始时候得状态,对象指针也将不再可用。
- 事务嵌套使用的时候必须一层一层的提交,而且必须父层的事务提交后,子层的事务才能生效,否则退回。
- 不同的数据库之间如果存在事务嵌套,内层事务不能调用commit方法,会出现异常
几个关于事务管理器的问题
- Transaction对象,要放在Using语句里面使用,因为它自身也需要dispose。如果没有使用Using语句,需要调用dispose()进行释放
- 如果使用了.net 语言中的 Using 关键字来表示事务的开始和结束,就不需要调用 Dispose()方法。
- 在关闭事务之前,应使用 Commit()方法提交所作的任何修改。在关闭事务前,如果没有提交修改,那么可以将任何修改回滚到事务启动之前的状态
- 如果一个对象在事务中以读模式打开,当这个事务被销毁后,需要重新开启事务并重新打开对象的写模式才可以更改操作对象
- 在事务期间打开的所有对象在事务结束时都会被关闭。
- 如果只是查询信息,就不需要提交或回滚
- 不同的数据库之间如果存在事务嵌套,内层事务不能调用commit方法,会出现异常
对象的读写状态
升级打开对象与降级打开对象
- 我们可以使用 UpgradeOpen()方法与DowngradeOpen()方法改变对象当前的打开模式
- 不必为每个UpgradeOpen()调用都配上一个 DowngradeOpen()调用,因为对象或事务的关闭能将实体的打开状态充分地清理干净
- 当只是查询一个对象时,就不要以写模式打开。以读模式打开对象并查询其属性比以写模式打开对象并查询效率高得多
- 以写模式打开对象会启动该对象的撤销登记。撤销登记用来跟踪对象的修改,这样,所做的任何修改都能被回滚
- 如果不能确定是否需要修改对象,最好以读模式打开对象,然后在需要时再升级为写模式。这样做能帮助减少程序开销
关于DBObject.Database.TransactionManager.TopTransaction的妙用
1、操作实体对象需要在事务中完成,于是对象就拥有了事务的属性,在封装方法的时候参数列表可以不用带事务到处跑。