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;
那在PHP下就无法执行事务处理了吗
楼主,你没有看帖么? 上面已经有人说了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是谁产生的呢?难道不会搞乱?
对了,假如满足条件的记录不止一条,下面的语句会将它们一一对应么?则table1.keyfield关联到table2.keyfield,一条主档记录对应一条或多条明细记录.SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summmary=@A WHERE type=1;
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
上面已经有人说了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是谁产生的呢?难道不会搞乱?
http://community.csdn.net/Expert/topic/3998/3998884.xml?temp=.5482294
UPDATE table2 SET summmary=@A WHERE type=1;
$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是哪个页面发过来的。
db=mysql_connect($host,$user,$pwd) //打开一个新连接而不是使用
db=mysql_connectd($host,$user,$pwd) //如果有一个连接,则使用这个连接
另外,事务回卷只是回卷该事务中涉及到的命令,不会回卷其它进程的查询。你可以自己开两个mysql窗口做试验么。
不过有一点倒是要注意,“事务”过程中并不代表其它进程不能更新这些表了,事务并不锁定表,如果你要实现类似这样的操作,要自己在事务中通过SQL来锁定。具体的看 MySQL 参考手册中 InnoDB 章节。