重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
近来稍有时间研究了下MYSQL中的事务操作,在很多场合下很是适用,譬如在注册的时候需要初始化很多张关联表的时候,问答回复的时候需要至少同时操作两张表,这些都会在某些时候只能成功更新一张表,而另外的SQL语句出现错误,正常的操作会导致初始化了一张表
成都创新互联专业为企业提供威海网站建设、威海做网站、威海网站设计、威海网站制作等企业网站建设、网页设计与制作、威海企业网站模板建站服务,十多年威海做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
,其他的都木有能初始化,这个时候就会导致用户表里的用户信息已经执行插入,导致提示注册失败,但是用户已经注册了部分信息,这个时候需要程序员去数据库删除相应的数据是一个比较不好的事情。
因此这边考虑使用事务,事务可以进行模拟SQL操作,当所有的SQL都操作成功的时候才进行SQL操作,只要有一个操作失败就回滚当前事务的所有SQL操作,避免出现上面描述中出现的数据写入不完整等情况。
下面是鄙人写的一小段代码,欢迎大家参考和提出意见:
复制代码
代码如下:
/**
*
@todo
多条sql的事务处理
*
@param
$sqls
array
*
@return
boole
true/false
*/
public
function
doArraySqlActionsTran($password,$sqls){
$db
=
$this
-
doSqlLink($password);//打开数据库链接
$db
-
autocommit(FALSE);//设置为不自动提交,因为MYSQL默认立即执行
//获取SQL执行结果数组
for
($i=0;$icount($sqls);$i++){
$result[$i]
=
$db
-
query($sqls[$i]);
}
//解析SQL执行结果数组
for
($j=0;$jcount($result);$j++){
if
($result[$j]==FALSE){
$result[$j]='false';
}else{
$result[$j]='true';
}
}
//查找SQL结果数组中是否存在false结果集
if
(in_array('false',$result)){
$sqlResult=FALSE;
}else{
$sqlResult==TRUE;
}
//根据结果集进行数据库回滚或者执行操作
if
($sqlResult==FALSE){
$db
-
rollback();//判断当执行失败时回滚
$return=FALSE;//
正式环境中使用
//$return='ROOLBACK';//test
标记使用
}else{
$db
-
commit();//执行事务s
$return=TRUE;//
正式环境中使用
//$return='COMMIT';//test
标记使用
}
$db-autocommit(true);
//设置为非自动提交——事务处理
$db-close();//关闭连接
return
$return;
}
到此事务执行批量SQL操作基本完成,谢谢大家!
事务支持
TPShop
ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法:
启动事务:
$User-startTrans();
提交事务:
$User-commit();
事务回滚:
$User-rollback();
事务是针对数据库本身的,所以可以跨模型操作的 。
例如:
// 在User模型中启动事务
$User-startTrans();
// 进行相关的业务逻辑操作
$Info = M("Info"); // 实例化Info对象
$Info-save($User); // 保存用户信息
if (操作成功){
// 提交事务
$User-commit();
}else{
// 事务回滚
$User-rollback();
}
注意:系统提供的事务操作方法必须有数据库本身的支持,如果你的数据库或者数据表类型不支持事务,那么系统的事务操作是无效的。
$con=mysqli_connect('localhost','root','123456','test');
if (!$con){
exit("连接错误");
}
mysqli_set_charset($con,'utf8');
mysqli_query($con,"BEGIN");//开启事务
$sql = "sql语句1";
$sql2 = "sql语句2";
$res = mysqli_query($con,$sql);
$res1 = mysqli_query($con,$sql2);
if($res $res1){
mysqli_query($con,"COMMIT");//提交事务
echo '提交成功。';
}else{
mysqli_query($con,"ROLLBACK");//事务回滚
echo '数据回滚。';
}
mysqli_query($con,"END");