我已经在下面添加了测试代码.

TestClass在自身内部有BUFFER个变量,在执行它的CONSTRUCTOR之后可用. 在代码执行任何UNDO或(UNDO, THROW...)之前,一切都运行正常.在此之后,类实例在其他方面保持不变,只是BUFFER变量现在是NOT AVAILABLE.

有什么方法可以阻止Progress做这件事吗?

在下面的测试代码中,第二个iValue = oTestClass:Value.将抛出错误,因为BUFFERUNAVAILABLE.

我使用的是Progress 11.7.5.

test.p:

DEF VAR oTestClass AS CLASS TestClass NO-UNDO.
DEF VAR iValue     AS INT NO-UNDO.

DO TRANSACTION:
    oTestClass = TestService:Singleton:Find().
    iValue= oTestClass:Value.
    UNDO.
END.

DO TRANSACTION:
    oTestClass = TestService:Singleton:Find().
    iValue = oTestClass:Value.
    UNDO.
END.

TestClassService.cls:

BLOCK-LEVEL ON ERROR UNDO, THROW.
CLASS TestService:
    
    DEF PUBLIC STATIC PROPERTY Singleton AS CLASS TestService NO-UNDO
        GET:
            IF TestService:Singleton = ? THEN TestService:Singleton = NEW TestService().
            RETURN TestService:Singleton.
        END.
        PROTECTED SET.
    
    DEF PRIVATE VAR oTestClass AS CLASS TestClass NO-UNDO.
    
    CONSTRUCTOR PROTECTED TestService(): END.
    
    METHOD PUBLIC CLASS TestClass Find():
        IF oTestClass = ? THEN DO:
            oTestClass = NEW TestClass(TO-ROWID("0x000000000017c201")).
        END.
        RETURN oTestClass.
    END.
END.

TestClass.cls:

BLOCK-LEVEL ON ERROR UNDO, THROW.
CLASS TestClass:
    DEF PRIVATE BUFFER MyTable_This FOR MyTable.
    DEF PUBLIC PROPERTY Value AS INT NO-UNDO
        GET:
            RETURN MyTable_This.Value.
        END.
    
    CONSTRUCTOR PUBLIC TestClass(i_rROWID AS ROWID):
        FIND FIRST MyTable_This WHERE ROWID(MyTable_This) = i_rROWID NO-LOCK.
    END.
END.

推荐答案

您可以在ABL Dojo上执行您的示例.

因为数据库表不是no-undo,所以任何undo语句都将undo撤消对它所做的任何操作,包括将buffer纳入作用域的find.

no-undo临时表上的缓冲区没有这个"问题".

Database相关问答推荐

为Postgres数据库字段创建复合索引

在GO中减少LevelDB数据库大小的问题(Levigo)

是否可以同时从 RocksDB 读取?

是否有一个简单的工具可以将 mysql 转换为 postgresql 语法?

在 PostgreSQL 的数组列中查找字符串

Select 正确的数据库:MySQL 与Everything 其它数据库

数据库设计:多表与单表

管理数据库中的产品计数

按请求的可变事务隔离级别

库存数据库的最佳 struct

ORM 性能成本

单向和双向关系关系的区别

无法启动 MongoDB:Windows 中的系统错误 1067

如何将数据库从一台计算机复制到另一台计算机?

省略日期中的毫秒数

如何一次插入1000行

你如何记录你的数据库 struct ?

游戏中使用什么样的数据库?

XML、CSV 或数据库格式的 ICD-9 代码列表

如何修复 Postgres 上过时的 postmaster.pid 文件?