我有X ++的问题.假设我有一个像这样的伪代码的事务
Custtable custTable;
ARandomTable mytable;
;
ttsBegin;
select forUpdate custTable where custTable.AccountNum == '4000';
custTable.NameAlias = custTable.Name;
custTable.update();
ttsBegin;
select forUpdate mytable where mytable.myField == 'abc';
mytable.myField = 'xyz';
mytable.update();
//ups something wrong happened... please abort the last
ttsAbort;
ttsCommit;
Run Code Online (Sandbox Code Playgroud)
为什么ttsAbort中止整个交易而不是上次开始的交易?有没有办法避免它?
为什么ttsAbort中止整个交易而不是上次开始的交易?
此行为可确保以第一个启动的事务的事务完整性ttsBegin.基本上,这首先ttsBegin是说:"启动一个新的事务,并且对于数据库,将此事务中的所有内容视为单个(原子)操作.如果您事务处理ttsCommit(对数据库将执行操作),事务结束或者a ttsAbort(在数据库中什么都不做)."
如果遇到第一个ttsBegin另一个ttsBegin,这就像是说:"对于ttsBegin你在第一个之后遇到的每一个,忽略一个ttsCommit."
由于事务被视为单个原子操作,因此您不能只是中止此操作的一部分.
有没有办法避免它?
在你的情况下,没有.但是,有一种方法可以确保将事务的一部分提交到数据库,即使整个事务被中止也是如此.这是使用单独UserConnection的内部事务完成的.请参阅如何使用UserConnection创建单独的事务,以确保您的事务不会在更高级别回滚以
获取更多信息.
| 归档时间: |
|
| 查看次数: |
3276 次 |
| 最近记录: |