如何使用PHP执行事务处理的操作?PHP3.6RC + MYSQL4.1.1
我在看MYSQL时版本还早,知道MyISAM、DBD、HEAP类型的表,但新添的InnoDB和ISAM类型的表都有什么功能呀?
在PHP下执行事务处理,又要怎么做哪,是用DBD类型的表好,还是InnoDB类型的表好。
最主要还是代码应该如何来写?
还望大家多多帮助~~~
问题点数:100、回复次数:22Top
1 楼jxflll(峰)回复于 2005-05-16 10:09:04 得分 5
沙发!帮你顶一下。Top
2 楼underone(再看抽你小丫的)回复于 2005-05-16 10:13:30 得分 5
关注
UPTop
3 楼twt326(天地小子)回复于 2005-05-16 11:33:52 得分 5
InnoDB类型的表支持事务处理,好像也是要MYSQL的版高一些才行Top
4 楼ChitchatPrince(幸福126+)回复于 2005-05-16 12:39:21 得分 0
MyISAM、DBD、HEAP类型的表,是在MYSQL 3。X版本中的有,MyISAM是普通的表,不支持事务;HEAP是内存里的表,速度快,但关机就没了,也不安全,DBD是安全表,支持事务,但我看书上说支持的不好,但不好在哪里就不知道了。
InnoDB和ISAM类型的表是在MYSQL 4。X中新添加,有什么功能就不知道了。
DBD和InnoDB都支持事务处理,但哪个要好一点哪?Top
5 楼ChitchatPrince(幸福126+)回复于 2005-05-16 12:40:21 得分 0
执行事务时,PHP的代码要怎样写呀?Top
6 楼lawyu(雨淋漓)回复于 2005-05-16 12:59:31 得分 5
php本身并不处理事务,mysql 4.0.11 以上版本用 START TRANSACTION 或 BEGIN 或 BEGIN WORK
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
Top
7 楼ChitchatPrince(幸福126+)回复于 2005-05-16 14:34:40 得分 0
那在PHP下就无法执行事务处理了吗Top
8 楼ChitchatPrince(幸福126+)回复于 2005-05-17 14:56:58 得分 0
期待中。。。。。Top
9 楼leinchu(忙啊,终于升级了)回复于 2005-05-17 16:55:22 得分 5
mysql4.1不支持子查询吗?Top
10 楼ChitchatPrince(幸福126+)回复于 2005-05-18 10:30:07 得分 0
呵呵,这个不太清楚Top
11 楼lanyd(寻找甘当科学家的女人)回复于 2005-05-18 11:06:45 得分 30
楼主,你没有看帖么?
上面已经有人说了innoDB和DBD都支持事务呀!
连代码都给出了!
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
不过,我也有一点不解.上面使用了@A变量.
但我发现在PHP用mysql_query("START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;")会报错!
原因是有2个分号,那我将它分为二句mysql_query("START TRANSACTION;
和mysql_query("SELECT @A:=SUM(salary) FROM table1 WHERE type=1;")就OK了.
why ??
还有,@A是MYSQL执行时的临时变量吧,那我如果像上面一样用几个mysql_query("")分步执行的,@A还能保存住么?
还有,万一几个进程同时进行数据库操作,MYSQL哪知道这个@A是谁产生的呢?难道不会搞乱?
Top
12 楼lanyd(寻找甘当科学家的女人)回复于 2005-05-18 11:10:55 得分 0
来看看这边高手的发言
http://community.csdn.net/Expert/topic/3998/3998884.xml?temp=.5482294
Top
13 楼lanyd(寻找甘当科学家的女人)回复于 2005-05-18 11:16:07 得分 0
对了,假如满足条件的记录不止一条,下面的语句会将它们一一对应么?则table1.keyfield关联到table2.keyfield,一条主档记录对应一条或多条明细记录.
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;Top
14 楼ChitchatPrince(幸福126+)回复于 2005-05-18 11:29:25 得分 0
幸福126+ 那就是我呀Top
15 楼ChitchatPrince(幸福126+)回复于 2005-05-18 11:41:08 得分 0
看到一个别人的贴
将数据库类型改为innoDB
$sql1 = "set auto_commite=0";
$sql2 = "begin";
$sql3 = "update......";
$sql4 = "update.......";
$sql5 = "commite";
$sql6 = "rollback";
mysql_query($sql1);
mysql_query($sql2);
mysql_query($sql3);
mysql_query($sql4);
if(mysql_errno)
mysql_query($sql5);
else
mysql_query($sql6);
要是这样的话,是不是不能使用一个稳固的连接。
比如说,几个人同时刷新,怎么知道SQL2是哪个页面发过来的。Top
16 楼ChitchatPrince(幸福126+)回复于 2005-05-18 11:43:54 得分 0
使用
db=mysql_connect($host,$user,$pwd) //打开一个新连接
而不是使用
db=mysql_connectd($host,$user,$pwd) //如果有一个连接,则使用这个连接
Top
17 楼lanyd(寻找甘当科学家的女人)回复于 2005-05-18 14:25:16 得分 0
晕了,不明白你是提问的,还是回答的了:pTop
18 楼lanyd(寻找甘当科学家的女人)回复于 2005-05-18 14:29:10 得分 0
看看我的怪问题,在PHP和MYSQL中如何搞定它!
http://community.csdn.net/Expert/topic/4014/4014752.xml?temp=.4669153Top
19 楼ChitchatPrince(幸福126+)回复于 2005-05-18 20:27:13 得分 0
呵,也没人回答呀,都是自己慢慢找的.Top
20 楼ChitchatPrince(幸福126+)回复于 2005-05-18 20:33:56 得分 0
可还是有点不懂
要是使用db=mysql_connect($host,$user,$pwd)来连接,速度不是要很慢.
要地使用db=mysql_connectd($host,$user,$pwd),会不会出现,当两个网页同时刷新时,一个网页进行事务处理,别一个网页就是简单的更新,当事务页出错时,数据回滚会不会把简单更新的处理也给回滚了呀.
MYSQL能认识是哪个网页在进行事务吗?Top
21 楼ChitchatPrince(幸福126+)回复于 2005-05-19 11:17:38 得分 0
............................................................................Top
22 楼rardge(Rardge)回复于 2005-05-19 11:30:19 得分 45
如果用 $db = mysql_connect($host, $user, $pwd) 来连接数据库服务器,那么不同网页(即使是一个网页多次提交)提交的连接请求都被返回一个不同的连接标识,而后的查询都是需要这个 $db 标识的(看看 PHP 语法就知道了),一旦PHP脚本程序已经执行完毕页面生成,那么这些都会被自动释放。所以不用担心 MySQL 会搞混不同地方来的查询请求。
另外,事务回卷只是回卷该事务中涉及到的命令,不会回卷其它进程的查询。你可以自己开两个mysql窗口做试验么。
不过有一点倒是要注意,“事务”过程中并不代表其它进程不能更新这些表了,事务并不锁定表,如果你要实现类似这样的操作,要自己在事务中通过SQL来锁定。具体的看 MySQL 参考手册中 InnoDB 章节。Top




