ITransaction 详解
ITransaction 是 OLE DB 中事务管理的核心接口,可以理解为"用来控制事务的对象"。
一、I 前缀的含义
| 字母 | 全称 | 含义 |
|---|---|---|
| I | Interface | 接口 |
在 OLE DB(以及整个 Windows COM 技术体系)中,所有接口都以 I 开头。
| 接口名 | 含义 |
|---|---|
ITransaction | Transaction Interface(事务接口) |
IRowset | Rowset Interface(行集接口) |
ICommand | Command Interface(命令接口) |
IUnknown | Unknown Interface(未知接口,所有接口的根) |
二、Transaction 的词源
| 单词 | 词源 | 含义 |
|---|---|---|
| Transaction | 拉丁语 trans(横穿)+ agere(做、驱动) | 事务、交易 |
词源演变:
text
拉丁语 trans(穿过)+ agere(做) ↓ transactio(完成、办理) ↓ 英语 transaction(事务、交易) ↓ 数据库领域:一组要么全部成功、要么全部失败的操作单元
同源词:transact(办理)、transactor(执行者)、action(行动)
三、ITransaction 是什么?
ITransaction 是 OLE DB 中代表一个事务的接口对象,通过它可以:
| 方法 | 作用 |
|---|---|
Commit() | 提交事务(保存所有更改) |
Abort() | 回滚事务(撤销所有更改) |
GetTransactionInfo() | 获取事务信息 |
AddRef() / Release() | 引用计数管理(COM 标准) |
四、可视化理解
text
┌─────────────────────────────────────────────────────────────┐ │ │ │ ITransaction 对象 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ │ │ │ │ │ 事务状态 │ 进行中 / 已提交 / 已回滚 │ │ │ │ └─────────────┘ │ │ │ │ ┌─────────────┐ │ │ │ │ │ 事务隔离级别│ 读未提交 / 读已提交 / 可重复读... │ │ │ │ └─────────────┘ │ │ │ │ ┌─────────────┐ │ │ │ │ │ 事务嵌套深度│ 支持嵌套事务的层级 │ │ │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ↓ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Commit() │ │ Abort() │ │ GetInfo() │ │ │ │ 提交事务 │ │ 回滚事务 │ │ 获取信息 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
五、典型的 OLE DB 事务代码
cpp
// 假设已经获取了 ITransaction 接口ITransaction* pTransaction = /* 从 Session 对象获取 */;HRESULT hr;// 开始隐式事务(通过设置 autocommit off 自动开始)// ... 执行一些数据库操作 ...// 提交事务hr = pTransaction->Commit(FALSE, 0, 0);if (SUCCEEDED(hr)) {
printf("事务提交成功\n");} else {
printf("事务提交失败\n");}六、ITransaction 在数据访问体系中的位置
text
┌─────────────────────────────────────────────────────────────┐ │ 应用程序 │ │ ↓ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ 数据源对象 (IDBInitialize) │ │ │ │ ↓ │ │ │ │ 会话对象 (IOpenRowset) │ │ │ │ ┌──────────┼──────────┐ │ │ │ │ ↓ ↓ ↓ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │ │ │ │ │ITransact│ │ICommand │ │ IRowset │ │ │ │ │ │ ion │ │ │ │ │ │ │ │ │ │ 事务 │ │ 命令 │ │ 行集 │ │ │ │ │ └─────────┘ └─────────┘ └─────────────┘ │ │ │ └───────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘
七、I 前缀的词源背景
在 COM(组件对象模型)中,I 前缀的命名规范来自:
| 背景 | 说明 |
|---|---|
| Interface | 接口的首字母 |
| 命名规范 | 所有接口都以 I 开头,便于识别 |
| 历史 | 由 Microsoft 在 1990 年代制定,成为 Windows 编程的标准 |
其他 COM 接口示例:
| 接口 | 含义 |
|---|---|
IUnknown | 所有 COM 接口的根 |
IClassFactory | 创建对象的工厂接口 |
IPersist | 持久化接口 |
IErrorInfo | 错误信息接口 |
八、总结
| 问题 | 答案 |
|---|---|
I 代表什么? | Interface(接口) |
Transaction 词源 | 拉丁语 trans(穿过)+ agere(做) |
ITransaction 是什么? | OLE DB 中代表事务的接口对象 |
| 提供什么方法? | Commit(提交)、Abort(回滚)、GetTransactionInfo(获取信息) |
| 在哪一层? | 会话对象(Session)之下,用于控制事务边界 |
一句话总结:ITransaction 是 OLE DB 中代表一个数据库事务的接口对象,其中的 I 是 COM 接口的标准前缀(Interface),Transaction 来自拉丁语“贯穿执行”,合起来就是能够贯穿执行一组数据库操作、并最终提交或回滚的接口。通过它可以调用 Commit() 提交事务或 Abort() 回滚事务