您好!欢迎访问家园网-www.jy.wang!

家园网

SQL的OLE DB中的fRetaining是个啥,讲讲

网络 作者:本站 点击:

SQL的OLE DB中的fRetaining是个啥,讲讲

OLE DB 中的 fRetaining 参数详解

fRetaining 是 OLE DB 中一个非常古老但设计精巧的参数。让我从词源、作用、使用场景全面讲清楚。


一、fRetaining 是什么?

fRetaining 是 OLE DB 中 ITransaction::Commit 和 ITransaction::Abort 方法的一个参数。

cpp

// OLE DB 的典型用法pITransaction->Commit(fRetaining, 0, 0);pITransaction->Abort(fRetaining, 0, 0);


二、词源拆解

部分词源含义
f匈牙利命名法前缀Boolean 标志(flag)
Retaining拉丁语 retinere(保留、保持)保留、保持

Retaining 的词源

text

拉丁语 re-(回、向后)+ tenere(握住、保持)
        ↓
retinere(留住、保留)
        ↓
古法语 retenir(保持)
        ↓
英语 retain(保留、保持)
        ↓
retaining(正在保留的)

同源词:retain(保留)、tenacious(坚韧的)、tenure(任期)、tenant(租客)


三、参数的含义

fRetaining 是一个布尔值,决定事务提交或回滚后,事务对象是否被保留

含义效果
TRUE保留事务提交/回滚后,事务对象仍然有效,自动开始一个新事务
FALSE不保留事务提交/回滚后,事务对象被销毁,需要重新创建

四、行为对比

场景:fRetaining = FALSE(默认行为)

cpp

// 假设计算机术语写错,应该是 FALSEpITransaction->Commit(FALSE, 0, 0);// 或pITransaction->Abort(FALSE, 0, 0);

效果

text

事务开始
    ↓
执行 SQL 操作...
    ↓
Commit(FALSE) 或 Abort(FALSE)
    ↓
事务结束(事务对象失效)
    ↓
想要新的事务 → 必须重新创建事务对象


场景:fRetaining = TRUE

cpp

pITransaction->Commit(TRUE, 0, 0);// 或pITransaction->Abort(TRUE, 0, 0);

效果

text

事务开始
    ↓
执行 SQL 操作...
    ↓
Commit(TRUE) 或 Abort(TRUE)
    ↓
当前事务结束(数据已提交或回滚)
    ↓
但事务对象被"保留"
    ↓
自动开始一个新的事务!


五、可视化理解

text

┌─────────────────────────────────────────────────────────────┐
│  fRetaining = FALSE(不保留)                               │
│                                                             │
│  ┌─────────┐   ┌─────────┐   ┌─────────┐                   │
│  │ 事务1   │ → │ Commit  │ → │ 事务结束 │                   │
│  └─────────┘   └─────────┘   └─────────┘                   │
│                             ↓(需要重新创建事务才能继续)     │
│                             ┌─────────┐                     │
│                             │ 事务2   │                     │
│                             └─────────┘                     │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  fRetaining = TRUE(保留)                                  │
│                                                             │
│  ┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────┐     │
│  │ 事务1   │ → │ Commit  │ → │ 自动   │ → │ 事务2   │     │
│  └─────────┘   └─────────┘   │ 新事务  │   └─────────┘     │
│                              └─────────┘                    │
│                            (事务对象被重复使用)            │
└─────────────────────────────────────────────────────────────┘


六、为什么需要 fRetaining

问题背景

在 OLE DB 出现之前(1990 年代),操作数据库的典型模式是:

cpp

开始事务
执行操作
提交事务// 如果想要下一次操作也在事务中...重新开始事务   ← 需要重新创建事务对象,开销大

解决方案

fRetaining = TRUE 让开发人员可以重复使用同一个事务对象,减少创建/销毁的开销,代码也更简洁。


七、代码示例对比

没有 Retaining(传统写法)

cpp

// 第一次事务ITransaction* pTrans = GetTransaction();pTrans->Start();DoSomeWork();pTrans->Commit(FALSE);  // 事务结束,pTrans 失效pTrans->Release();      // 释放// 第二次事务(需要重新创建)ITransaction* pTrans2 = GetTransaction();  // 重新创建pTrans2->Start();DoMoreWork();pTrans2->Commit(FALSE);pTrans2->Release();

使用 Retaining(简化写法)

cpp

ITransaction* pTrans = GetTransaction();pTrans->Start();for (int i = 0; i < 100; i++) {
    DoWork(i);
    
    if (i % 10 == 0) {
        // 每10次操作提交一次,但事务对象保留
        pTrans->Commit(TRUE);  // 事务保留,自动开始新事务
    }}pTrans->Commit(FALSE);  // 最后彻底提交,不保留pTrans->Release();


八、fRetaining 的优缺点

优点缺点
减少事务对象创建/销毁开销可能让代码逻辑不够清晰
代码更简洁忘记设置 FALSE 可能导致事务意外持续
适用于批处理场景现代 OLE DB 使用较少

九、历史地位

时间事件
1990 年代OLE DB 推出,fRetaining 是先进设计
2000 年代ADO.NET 出现,fRetaining 概念被隐藏
现在OLE DB 仍在 Windows 底层使用,但应用层很少直接操作

现代等价概念

  • JDBC:没有直接对应,但 setAutoCommit(false) + 手动提交类似

  • ADO.NETTransactionScope + 隐式事务管理

  • Python sqlite3conn.isolation_level 控制事务行为


十、总结

问题答案
fRetaining 是什么?OLE DB 事务方法的参数,决定事务提交/回滚后是否保留事务对象
词源f(flag 标识符)+ Retaining(拉丁语 retinere“保留”)
TRUE 的作用提交/回滚后自动开始新事务,事务对象被重用
FALSE 的作用提交/回滚后事务对象失效,需要重新创建
主要目的减少事务对象创建销毁开销,简化批量操作代码

一句话总结fRetaining 中的 Retaining 来自拉丁语“保留”,这个参数控制事务结束后是否保留事务对象并自动开始新事务——就像自动扶梯,走到终点后不是让你下来,而是继续循环(TRUE 保留)vs 普通电梯,到了终点必须出来重新进去(FALSE 不保留)



标签: