$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;
//开始一个事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END");
kider 发表于 2014-3-18 16:24
这样应该是不管怎样都提交了吧。
貌似是要判读一下吧
nycle 发表于 2014-3-18 20:21
是的,最好要做异常控制。
楼主的这种情况是正常的,分析如下:
1.由于楼主是一条条手工进行命令行测试的 ...
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `sp_mysqlpub`$$
CREATE PROCEDURE sp_mysqlpub (v_value INT)
BEGIN
/** 标记是否出错 */
DECLARE t_error INT DEFAULT 0;
/** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; -- 出错处理
START TRANSACTION; -- 或 SET autocommit = off;
INSERT INTO test VALUES(8888);
INSERT INTO test VALUES(v_value);
IF t_error=1 THEN
ROLLBACK; -- 事务回滚
ELSE
COMMIT; -- 事务提交
END IF;
END$$
DELIMITER ;
CALL sp_mysqlpub(1);
CALL sp_mysqlpub(11);
CALL sp_mysqlpub(NULL);
CALL sp_mysqlpub('abc'); -- 特殊情况
SHOW WARNINGS;
CREATE TABLE `test` (
`id` int(10) NOT NULL
) ENGINE=InnoDB;
kider 发表于 2014-3-19 10:56
这两篇关于MySQL事务的帖子值得细看看:
MySQL存储过程之事务管理
je_ck 发表于 2014-3-19 15:01
事务是跟着连接(connect)在一起的。
你的第一个insert语句是正常的。所以对于当前连接来说是有效的。
...
欢迎光临 MySQL社区 (http://www.mysqlpub.com/) | Powered by Discuz! X3.2 |