免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1121 | 回复: 0
打印 上一主题 下一主题

开发札记 关于 Adodb 的事务方法的使用. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-31 13:00 |只看该作者 |倒序浏览
在 Adodb 的 Manual 中对事务方法的说明到:
BeginTrans() : 当对象开始执行一个事务操作时,它先会把 autoCommit 模式关闭.在MySQL中SQL语法为: SET AUTOCOMMIT=0; 如果执行成功.BeginTrans() 会返回一个 true 值.但是如果一些数据库不支持事务,它会返回一个 false 值.目前在MySQL的高版本和一些其他的数据库中已经可以很好的支持事务了.但是要MySQL数据库支持事务必须不能使用MyISAM类型表.一般使用InnoDB类型表来使用MySQL的事务功能.如果事物没有手动提交(即没有执行 COMMIT;命令.)数据库连接关闭时它会自动的回滚(即执行 ROLLBACK;命令.)
通常下面的程序写法是错误的使用事务模式:
$DB->BeginTrans();
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans();
以上不好的原因在于在执行过程中没有对过程中的可能的错误进行检查.
可以用下面的方法来使用事物.比上面的用法要好.
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if($ok) $ok=$DB->Execute("update table2 set val=$val2 where id=$id");
if ($ok) $DB->CommitTrans();
else $DB->RollbackTrans();  
或者用下面的方式来使用事物.比上面的稍微简略一点.
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if($ok) $ok=$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans($ok);
CommitTrans($ok=true);
该函数执行对事务的提交(相当于在数据库终端输入BEGIN; 命令后,再通过一些SQL操作后,输入 COMMIT;命令.),如果执行成功,则会返回一个 true 值.如果数据库不支持事务模式,该函数也会返回一个 true 值.(因为数据被自动提交了^0^). 如果 参数 $ok=false 时,函数功能相当于一个 RollbackTrans() . 数据库会执行回滚操作. 上面最后的一个例子可以演示这个功能.
RollbackTrans($ok=true);
该函数会对数据库执行回滚操作.如果执行成功.返回一个 true 值.如果数据库不支持事务模式,该函数会返回一个 false 值. 因为数据已经被修改了.
Adodb 提供一个更简洁的事务模式供我们使用.在手册的事务模式章节里.介绍一几个比较方便的使用事物的函数.干脆把它们翻译过来.以后看着方便.
StartTrans();
该函数开启一个事务监视器,当SQL语句被执行时,Adodb会监视所有的SQL错误.当探测到错误时.当执行 CompleteTrans() 函数时,它会执行回滚操作.
为了使我们明白StartTrans()比BeginTrans()更高级.我们来检查一下这两个函数的使用.用先前用过的例子来说明.
$DB->BeginTrans();
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans();
上面这个例子是错误的使用事务的模式,因为不可能能保证成功执行其中的所有操作,因为在执行过程中没有进行执行结果检查.再用下面稍好一点的方法来使用事物模式.
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if($ok) $ok=$DB->Execute("update table2 set val=$val2 where id=$id");
if ($ok) $DB->CommitTrans();
else $DB->RollbackTrans();
或者使用下面这样:
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if($ok) $ok=$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans($ok);
虽然上面两种方法可以正确的执行事务操作.但是执行结果变量$ok的存在让人很不爽.
StartTrans() 比 BeginTrans() 先进之处在于,它会帮你监视所有的SQL执行错误.
特别的,执行了 StartTrans() 后,即使能再执行 BeginTrans() , CommitTrans(), RollbackTrans() 等操作都被视位无效.即被忽略掉.而且 StartTrans() 支持嵌套(多次)使用.但是以第一个为准.在它以下的将被忽略掉.
$DB->StartTrans();
CallBlackBox();
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CompleteTrans();
即使上面代码中CallBlackBox()中有执行COMMIT操作.也会被忽略掉.
CompleteTrans($autoComplete=true);
它将为 StartTrans() 函数完成事务操作,这个函数的监视器会监视所有的SQL错误.如果没有错误,则执行提交操作,否则执行回滚操作.如果是提交操作.它返回一个true值,是回滚操作,返回一个false值.函数参数$autoComplete设置为true时,函数依据有无SQL错误执行提交或者回滚操作.如果设置为false时,会执行回滚操作.即使前面没有SQL错误发生.
FailTrans();
该函数让一个由StartTrans()发起的事物失败.当CompleteTrans()函数被执行时,仅仅执行回滚操作.

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13344/showart_240834.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP