用PowerBuilder的人都肯定有用到过Commit(提交事务语句)和RollBack(回滚事务语句)。在理解上有一点是值得注意的,这里我想和大家一起来分享:
1、提交事务语句COMMIT
COMMIT语句提交事务,完成数据库的物理修改。执行该语句后,将关闭所有先前打开的游标(CURSOR)和过程(PROCEDURE),并开始一个新的事务。COMMIT语句的语法格式为:
COMMIT{USING TransactionObject};
其中,TransactionObject是需要永久更新数据库的事务对象名,缺少时使用事务对象SQLCA。
2、回滚事务语句ROLLBACK
ROLLBACK(回滚)语放弃自上一个COMMIT、ROLLBACK或CONNECT语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。其语法格式为:
ROLLBACK{USING TransactionObject};
其中,TransactionObject是事务对角名,缺少时使用事务对象SQLCA;
注意:在 PB中应用最多的 DataStore,而当在进行Commit,RollBack时,并没有清除 DataStore中的内容。
案例:
……
// 数据更新
ll_returnvalue = lds_detail.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '店铺'+ls_site+'detail.dbf数据处理成功!'
ll_returnvalue = lds_inventory.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '仓存数据处理成功,正在提交…'
Commit using SQLCA;
st_text.Text = '恭喜,数据提交成功!'
f_readwrite('r')
Else
Rollback using SQLCA;
f_readwrite('e')
End If
Else
Rollback using SQLCA;
f_readwrite('e')
End If
……
lds_detail(销售 DataStore),lds_inventory(仓存 Datastore)以上的代码在进行循环操作时,如果某个lds_detail更新失败,Rollback using SQLCA之后继续循环时,lds_detail由于功能需要会赋新值,而这时lds_inventory中的内容虽然没有更新,但内容还在。所在在继续循环时就会一次更新,产生意料之外的错误---数据不一致。
解决办法:
在每次Rollback后应即可释放(Destroy)或(Reset) DataStore。
正确代码:
……
// 数据更新
ll_returnvalue = lds_detail.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '店铺'+ls_site+'detail.dbf数据处理成功!'
ll_returnvalue = lds_inventory.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '仓存数据处理成功,正在提交…'
Commit using SQLCA;
st_text.Text = '恭喜,数据提交成功!'
f_readwrite('r')
Else
Rollback using SQLCA;
Destroy lds_inventory //或 lds_inventory.Reset()
f_readwrite('e')
End If
Else
Rollback using SQLCA;
Destroy lds_inventory //或 lds_inventory.Reset()
f_readwrite('e')
End If
1、提交事务语句COMMIT
COMMIT语句提交事务,完成数据库的物理修改。执行该语句后,将关闭所有先前打开的游标(CURSOR)和过程(PROCEDURE),并开始一个新的事务。COMMIT语句的语法格式为:
COMMIT{USING TransactionObject};
其中,TransactionObject是需要永久更新数据库的事务对象名,缺少时使用事务对象SQLCA。
2、回滚事务语句ROLLBACK
ROLLBACK(回滚)语放弃自上一个COMMIT、ROLLBACK或CONNECT语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。其语法格式为:
ROLLBACK{USING TransactionObject};
其中,TransactionObject是事务对角名,缺少时使用事务对象SQLCA;
注意:在 PB中应用最多的 DataStore,而当在进行Commit,RollBack时,并没有清除 DataStore中的内容。
案例:
……
// 数据更新
ll_returnvalue = lds_detail.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '店铺'+ls_site+'detail.dbf数据处理成功!'
ll_returnvalue = lds_inventory.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '仓存数据处理成功,正在提交…'
Commit using SQLCA;
st_text.Text = '恭喜,数据提交成功!'
f_readwrite('r')
Else
Rollback using SQLCA;
f_readwrite('e')
End If
Else
Rollback using SQLCA;
f_readwrite('e')
End If
……
lds_detail(销售 DataStore),lds_inventory(仓存 Datastore)以上的代码在进行循环操作时,如果某个lds_detail更新失败,Rollback using SQLCA之后继续循环时,lds_detail由于功能需要会赋新值,而这时lds_inventory中的内容虽然没有更新,但内容还在。所在在继续循环时就会一次更新,产生意料之外的错误---数据不一致。
解决办法:
在每次Rollback后应即可释放(Destroy)或(Reset) DataStore。
正确代码:
……
// 数据更新
ll_returnvalue = lds_detail.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '店铺'+ls_site+'detail.dbf数据处理成功!'
ll_returnvalue = lds_inventory.Update(true,true)
If ll_returnvalue > 0 Then
st_text.Text = '仓存数据处理成功,正在提交…'
Commit using SQLCA;
st_text.Text = '恭喜,数据提交成功!'
f_readwrite('r')
Else
Rollback using SQLCA;
Destroy lds_inventory //或 lds_inventory.Reset()
f_readwrite('e')
End If
Else
Rollback using SQLCA;
Destroy lds_inventory //或 lds_inventory.Reset()
f_readwrite('e')
End If