mysql事务不自动提交注意事项

使用公司框架写了个php脚本,执行一些数据插入更新等,代码中用到了mysql事务,但是很奇怪的是我每次循环执行最后一条数据更新不会生效,而这条sql执行是在事务之外的,而事务却都执行成功了,数据也都返回成功,如果把事务关闭了,最后一句sql也会执行成功。分析问题应该是mysql事务相关的问题,最开始以为是我自己写的代码问题,但是检查,测试了半天也没发现,于是考虑是否是mysql环境设置问题,对比,修改事务级别等也没有解决。最后怀疑是原有框架的mysql驱动有问题。于是复制原有驱动(mysqli)的代码,重新使用pdo扩展写一份,修改的过程写到事务相关的代码时,突然想到,是否是设置autocommit =  0;导致的。因为开启事务一般都会把autocommit设置为0. 这是常识,结合之前学到的知识,每一个sql其实都是一个简单的事务,所以就开始了测试。测试代码如下:

beginTransaction();
		self::$db->setAutocommit(0);//第二次执行替换代码
		$data = array(
			'type' => 'test',
			'email' => '[email protected]',
			'code' => rand(0, 255),
			'times' => $this->chance,
			'ip' => '127.0.0.1',
			'createtime' => time()
		);
		$row = self::$db->insert('testms', $data);
		if(!$row){
			// echo 'rollbacked' . PHP_EOL;
			// self::$db->rollback();
			return false;
		}
		$insertid = self::$db->getInsertid();
		var_dump($row, $insertid);

		// self::$db->commit();
		return $insertid;
	}

	public function exctest()
	{
		$result = $this->totest();
		if($result){
			$res = self::$db->update('goods', array('status' => '0'), array('id' => '123'));
			var_dump($res);
			echo 'over';
		}else{
			$res = self::$db->update('goods', array('deleted' => '1'), array('id' => '123'));
			echo 'fail';
		}
	}
}

$test = new testcommit();
$test->exctest();

其中注释代码是第一次测试的代码,其中beginTransaction中自动设置了autocommit为0。而rollback和commit中没有设置。第一次测试果然testms数据插入了进去,但是没有更新goods表。第二次测试将事务注释掉,只添加设置autocommit=0,如预期结果,testms表和goods都么有插入和更新。第三次设置autocommit=1.结果都执行成功并数据成功提交生效。

为解决最后问题,在事务结束后重新将autocommit设置为1即可。

你可能感兴趣的:(mysql,php,事务,mysql,php)