请教commit 与rollback的作用和用法。

MichaelW666 2009-12-18 06:17:01
什么时候用commit和rollback呢。
我一般连接数据库时都将Antocommit设置为False
但我在程序里和后台数据库交互时好像很少用到commit和rollback 语句呀。
哪位兄弟能帮我解释解释他们的作用以及在什么时候用的上呢?
...全文
1018 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsz0812 2009-12-19
  • 打赏
  • 举报
回复
commit 就是提交事务

rollback 就是回滚事务
wag_enu 2009-12-19
  • 打赏
  • 举报
回复
autocommit = false 时,
当有对数据库表更新的时候,数据库会锁表,在有明确的 commit 或 rollback 之后才解锁.
wag_enu 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pb8 的回复:]
如果没有commit,你所有的修改都是针对你当前连接数据库的这个会话的,修改都会放在数据库的内存中,不会真正写到数据库中,
你可以做一个实验,两个一样的程序,autocommit设置为false,都不使用commit,两个程序都打开运行,第一个程序修改一个数据,第二个程序点检索,在第一个程序中,数据是已经改了的,重新点检索也可以看到修改后的数据,第二个程序中看不到的,要等第一个程序退出后才看得到,因为在关闭会话时自动提交了
[/Quote]

我想补充:
借助 #1楼的例子,将 autocommit 设置为 false 再在SQL语句过后commit ;
是为了保证当要多处往库表里写数据时多处数据的一至性.
例子中,两条语句必须都执行成功后,才往数据库表里写相关的数据 也就是 commit ;
任何一条语句执行失败,都要 rollback; 也就是撤销往数据库表里写数据.
pb8 2009-12-19
  • 打赏
  • 举报
回复
如果autocommit设置为true,执行完SQL后就会自动提交的,commit没什么意义,
一般autocommit在调用updateblob或selecblob时使用,
autocommit设置为true一般是在读取和写入大二进制类型数据时使用,
你可以看一下pb的相关帮助
MichaelW666 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pb8 的回复:]
如果没有commit,你所有的修改都是针对你当前连接数据库的这个会话的,修改都会放在数据库的内存中,不会真正写到数据库中,
你可以做一个实验,两个一样的程序,autocommit设置为false,都不使用commit,两个程序都打开运行,第一个程序修改一个数据,第二个程序点检索,在第一个程序中,数据是已经改了的,重新点检索也可以看到修改后的数据,第二个程序中看不到的,要等第一个程序退出后才看得到,因为在关闭会话时自动提交了
[/Quote]

那如果我将autocommit设置为True,需要使用commit提交事务吗?
pb8 2009-12-18
  • 打赏
  • 举报
回复
如果没有commit,你所有的修改都是针对你当前连接数据库的这个会话的,修改都会放在数据库的内存中,不会真正写到数据库中,
你可以做一个实验,两个一样的程序,autocommit设置为false,都不使用commit,两个程序都打开运行,第一个程序修改一个数据,第二个程序点检索,在第一个程序中,数据是已经改了的,重新点检索也可以看到修改后的数据,第二个程序中看不到的,要等第一个程序退出后才看得到,因为在关闭会话时自动提交了
MichaelW666 2009-12-18
  • 打赏
  • 举报
回复
能具体说明他们的作用吗?
必将万分感谢
pb8 2009-12-18
  • 打赏
  • 举报
回复
呵呵,为了抢沙发,刚else里面还要加上rollback using sqlca;
pb8 2009-12-18
  • 打赏
  • 举报
回复
事务可以理解为不可分隔的一系列原子操作的集合
如果你平常没写commit,autocommit=false,那样的话一般在你断开数据库的时候数据才会提交
pb8 2009-12-18
  • 打赏
  • 举报
回复
这里主要提到事务的概念,有一个典型的例子,银行转帐,
a帐户转100到b帐户,需要执行两条语名
update account set n_money=n_money-100 where id='a'
update account set n_money=n_money+100 where id='b'
两条语句必须不可分隔必须同时成功或同时失败的,这样就需要写成;
update account set n_money=n_money-100 where id='a'
if sqlca.sqlcode=0 then
update account set n_money=n_money+100 where id='b'
if sqlca.sqlcode=0 then
commit Using sqlca;
messagebox('','OK!')
else
messagebox('err','e2')
end if
else
messagebox('err','e1')
end if

754

社区成员

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

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