几个没搞懂的问题,想请教!

xl1004 2003-10-17 02:17:46
1.当执行脚本里一个SQL语句,比如insert into table_a(...) values(a,b,c..);如果不用commit提交或rollback回滚,数据库里table_a表数据有变化没有?当在插入以后用一个基于该表的数据窗口,做dw_1.retrieve()操作,这些数据却都可以找到.这是不是插入的数据放在本地的缓冲区里,用retrieve也是从本地缓冲区里读的数据?

2.当执行一个SQL语句后,用SQLCA.SQLCODE来判断(假设事物对象SQLCA)语句执行成功与否,该怎么判断,比如update table_2 set col1='aa',col2='bb' where col1='cc';
假如字段col1没有匹配'cc'的,这条语句返回的sqlca.sqlcode为0?100?-1?书上说的执行成功,有数据返回是0,执行不成功是-1,执行成功,没数据返回是100,针对select\insert\update不同操作该怎么理解?

3.select语句后要不要用commit/rollback?
...全文
49 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸡翅多 2003-10-21
  • 打赏
  • 举报
回复
mysql已经开始支持事务了
mittee 2003-10-21
  • 打赏
  • 举报
回复
3、至于Select之后是否需要Commit, 我认为为了不出错,都加上得。不会浪费机器时间。
老吴子 2003-10-21
  • 打赏
  • 举报
回复
实际上在你执行SQL语句(DataWindow.Update)后,有关更改已经写到数据库中(不是在客户端缓冲区中),一般的DBMS均是先写Log后写数据,在Commit后DBMS确认修改,在Commit前,数据处于Suspect状态,这时是不稳定的,因为用户可能Rollback掉。如果这时你将隔离级别设为Read UnCommited (脏读),执行dw.retrieve()是可以得到这部分数据的,当然是从DBMS读取。而在PB中缺省的隔离级别是Read Commited,故而,一般情况下读不到。对于不支持事务的数据库,Commit/Rollback当然无效。
xl1004 2003-10-21
  • 打赏
  • 举报
回复
哈哈~~~明白鸟~~~~~~~~~~~~~感谢大家~~~~~特别是zdgdh(老吴子),xuyi1979(小熠) 结帖~~~~~
xl1004 2003-10-20
  • 打赏
  • 举报
回复
to all,感谢大家的回复,由于周末没上班,到今天才来。

========================================================
1.我就是用oracle8i时,发现这个问题的。我用类似下面的语句
update table_a set col='aa',col='bb' where 1=2;就是where条件不满足时,这条语句sqlca.sqlcode返回0,看了xuyi1979(小熠)的回复现在明白了不同DBMS返回值不同,我再去试试。

2.看了zdgdh(老吴子)的回复,我没搞懂假如可以dw_1.retrieve()到数据,是取的本地缓冲区里的数据还是重新去数据库里下的?commit是将数据从本地缓冲区放到数据库,还是数据在执行SQL语句后就已经在数据库里改变,commit只是确认该数据不回滚?rollback也一样,是确确实实在数据库里执行已经改变的数据的回滚,还是只是取消本地数据往数据库提交的意思?

另:假如象mysql一类没有事务概念的数据库,用PB写程序时,commit/rollback有含义没有?是不是没必要用?
fulongbiao 2003-10-18
  • 打赏
  • 举报
回复
1、在程序中执行sql语句如insert等,如果你的Transact的AutoCommit = False那么就需要commit或Rollback,否则数据库的记录不会有变化。如果是在执行sql语法的工具中执行sql语句,则不需要commit.
老吴子 2003-10-17
  • 打赏
  • 举报
回复
建议看看数据库相关资料,我补充几点:
1、一般情况下,不要使用系统缺省的CommitOnDisconnect;
2、如果改变没有Commit,后续的Retrieve能否读出该纪录,取决于你所用的隔离级别;
3、至于Select之后是否需要Commit,则不能简单的说不需要,PowerBuilder开发M$ SQL Server时,由于多种原因,在Retrieve后会自动加上"begin transaction",对M$ SQL Server影响较大;而事实上,PFC采用了完全不同的方式。
klbt 2003-10-17
  • 打赏
  • 举报
回复
来晚了,楼上几位说得很全面了,up
xuyi1979 2003-10-17
  • 打赏
  • 举报
回复
关于第二条,不同的数据库是结果不一样的,举例的UPDATE在ORACLE和DB2中表现就不同。
bomber2001 2003-10-17
  • 打赏
  • 举报
回复
我个人意见,一般不推荐:AutoCommit = true,对于更改sql语句,进行及时进行提交、回滚的操作,对于直接select语句,完全可以跟提交等冬冬绝交。^_^
对于sqlcode,可以看看帮助,transaction里面的帮助挺好的。
clj630 2003-10-17
  • 打赏
  • 举报
回复
同意楼上
fmilan 2003-10-17
  • 打赏
  • 举报
回复
楼上说的已经很完整了,up一把
longdrang 2003-10-17
  • 打赏
  • 举报
回复
正如 ropriest(馆主) 所說
chrisfy 2003-10-17
  • 打赏
  • 举报
回复
ropriest(馆主) 已解开了你的疑惑
ropriest 2003-10-17
  • 打赏
  • 举报
回复
1、在程序中执行sql语句如insert等,如果你的Transact的AutoCommit = False那么就需要commit或Rollback,否则数据库的记录不会有变化。如果是在执行sql语法的工具中执行sql语句,则不需要commit.

2、如楼上所说。

3、没有必要。
qqjj7758 2003-10-17
  • 打赏
  • 举报
回复
1。有变化
2。select 0 返回有数据 -1 数据连接或其他错误 100 返回没数据
insert 0 成功插入 -1 数据连接或其他错误 100 插入成功,但数据没变
update 0 成功修改数据 -1 数据连接或其他错误 100 修改成功但数据没变化
3.可以不要 但可以整理事务 缓冲池

740

社区成员

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

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