关于commit的问题

pecker 2003-03-28 05:28:16
应该在什么时机用commi语句呢?
是在每个update,insert或delete语句后面都用呢?
还是只要在application的close事件中用一次呢?

如果我在一条update语句后面没有用commit,那么,紧接着来一句select,会不会取到更新的数据呢?

这么小的问题,真不好意思问出口,没办法,笨啊!
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyh 2003-03-31
  • 打赏
  • 举报
回复
ROLLBACK(回滚)语句放弃自上一个COMMIT、ROLLBACK或CONNECT语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。

aaa 应该是200
pecker 2003-03-31
  • 打赏
  • 举报
回复
接着问:
我还是对于commit和rollback不太清楚

如果我用了一条update,把字段aaa(假设为 数字型) 改成100
假设改写成功,用了一条commit,这时,数据库中aaa的值为100
第二次这样操作,把aaa改成200.
当第三次试图把aaa改成300.
这时候出错了。那么根据判断用了一条rollback
这个时候,再读取aaa应该是什么值呢?

先假定sqlca.autocommit=false
我设想的语句是这样的:

1: update tablename
set aaa=100 ;
2: if ....then //假设这里执行的是commit
commit;
else
rollback;
endif
3: update tablename
set aaa=200;
4: if ..... then //假设这里执行的是commit
commit;
else
rollback;
endif
5: update tablename
set aaa=300;
6: if .... then //假设这时候执行的是rollback
commit ;
else
rollback;

按照上面的假设条件:减缩成:
update tablename set aaa=100;
commit;
update tablename set aaa=200;
commit;
update tablename set aaa=300;
rollback;
这最后一个rollback,back到哪里呢?
按照我的理解,既然最后一个update没有执行,那应该rollback的是第二句update.那么aaa应该是100.
这样不是跟程序设计的初衷有误差吗?

我不明白。


shahand 2003-03-28
  • 打赏
  • 举报
回复
//应该在什么时机用commi语句呢?
//是在每个update,insert或delete语句后面都用呢?
//还是只要在application的close事件中用一次呢?
:尽量早,在update,insert,delete之后



//如果我在一条update语句后面没有用commit,那么,紧接着来一句select,
//会不会取到更新的数据呢?
能够


及时提交(commit)是一个很好的习惯
th820901 2003-03-28
  • 打赏
  • 举报
回复
在缺省情况下,当应用程序运行disconnect 时,系统会自动运行一条commit语句,这对我们来说并不是总是有利的,有时我们在运行discnnect时希望由程序本身决定是提交还是回滚。

若我们在事务对像中的commitondisconnt的dbpram的参数设置为'yes'后,运行disconnect时系统就会自动运行一条commit语句,完成事务提交:若设置为no,刚自动完成一条rollback语句回滚事务
McdullMini 2003-03-28
  • 打赏
  • 举报
回复
最好还是在每个操作
比如一个button的click中
有多条修改数据库的语句
那么最好在所有的操作都结束以后再commit
不需要每条update或insert语句都commit
butter527 2003-03-28
  • 打赏
  • 举报
回复
andyzq说的很好
如果sqlca.autocommit = false就要在每次操作数据库时写commit。
而sqlca.autocommit默认是false,一般情况下都是要写的,但写以前最
好验证一下sqlcode的值.
yehe999 2003-03-28
  • 打赏
  • 举报
回复
integer rtn

CONNECT USING SQLCA;

dw_employee.SetTransObject(SQLCA)

rtn = dw_employee.Update()

IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN
COMMIT USING SQLCA;

ELSE
ROLLBACK USING SQLCA;

END IF
andyzq 2003-03-28
  • 打赏
  • 举报
回复
如果设置了SQLCA.AutoCommit = true,那么就不需要写commit了,没有设置的话还是写commit
好的习惯还是写commit

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧