高手请指点!关于OCIExecute的奇怪问题,回复也有分!
我是PHP的新手,关于OCIExecute的参数,我只知道:
OCI_DEFAULT 是不自动commit
OCI_COMMIT_ON_SUCCESS 是自动commit;
现在有这样一个问题
下面是一段程序,省略了一些步骤
1) $con = dbConnect(); // 取得DB连接,OCILogon
2) $userNo = getUserSeqNo($con, $uid); // 查询操作
3) updateMail($email, $userId, $con); // 更新操作
4) $magaName[$index] = getMailMagaName($para_type); // 查询操作
5) dbCommit($con); // 调用OCICommit
6) dbClose($con); // 关闭DB连接,OCILogoff
在程序执行中,所有的OCIExecute都是使用的OCI_DEFAULT,没有任何错误发生,其中2)和3)是使用1)取得的DB连接。
4)是自己建立新的连接然后关闭,只执行一条select, 也是OCI_DEFAULT的,没有调用OCICommit();
现在问题是,虽然没有检测到任何错误,但是3)的更新没有成功。但是如果把4)的OCIExecute的参数改为OCI_COMMIT_ON_SUCCESS,3)的更新就可以成功。
这是为什么?4)和其他的步骤不是两个transaction吗?怎么会有影响?
请各位高手指点!
问题点数:100、回复次数:12Top
1 楼piner(nadmin 简称难民)回复于 2005-02-04 13:58:24 得分 10
当然要commit了Top
2 楼butcher2002(我又出来捣乱了)回复于 2005-02-04 14:39:39 得分 40
因为第一条是0
比如4条
是
0,1,2,3Top
3 楼superswords(supersword)回复于 2005-02-04 15:30:36 得分 0
to piner(天下加油站)
4)是单独的一个事务,并且只是select, 我觉得对其他的操作不应该产生影响啊
to butcher2002(发言仅代表个人观点,不保证正确)
什么意思?能不能解释清楚一些?Top
4 楼piner(nadmin 简称难民)回复于 2005-02-04 15:49:22 得分 35
$db = new DB;
$db->query(update tb set a='a' where id=1);
$db->query(update tb set b='b' where id=2);
$db->query(update tb set c='c' where id=3);
$db-> commit();
你说这样会不会三个语句都执行呢?你用的是同一个会话,所以在4)做commit,3)会更新成功是没错的
Top
5 楼superswords(supersword)回复于 2005-02-04 16:11:59 得分 0
如果是用的一个connect,当然可以理解。
可是4)和其他的语句用的不是一个connect。
况且,我在5)也做了commit,为什么如果4)不做commit, 3)就会失败呢?
难道我对事务的概念理解有误?Top
6 楼superswords(supersword)回复于 2005-02-05 18:31:10 得分 0
自己顶
Top
7 楼leyan728(乐言)回复于 2005-02-07 17:22:07 得分 5
oracle函数库.呵呵,还在学习中.Top
8 楼kkobebryant(分手不是我的本意)回复于 2005-02-07 20:12:24 得分 5
新年快乐!
Top
9 楼jimnet(jim)回复于 2005-02-08 05:41:26 得分 5
学习。顶Top
10 楼superswords(supersword)回复于 2005-02-16 13:39:52 得分 0
???Top
11 楼superswords(supersword)回复于 2005-03-11 14:34:21 得分 0
??Top
12 楼superswords(supersword)回复于 2005-05-18 14:51:08 得分 0
唉,终于找到答案了。
原因是在PHP里面,一个transaction没有结束前,再去连接同一个DB的话就会出问题,导致前一个连接关闭。
所以正确的应该是在4)中不用新建立连接,而是使用既存的连接。Top




