PHP下 *** 作mysql数据库要实现事务提交,需注意以下方面:
1, 数据库表存储引擎类型设置为innoDB。默认的mysql表采用MYISAM引擎,是不支持事务的,因此要采用以下语句变更:
mysql>alter table ‘table_name’ engine=innodb
2,PDO对象设置要设置errmode为Exception,否则第16行SQL执行出错,语句也不会跳到catch段去rollback, 而是继续向下执行直到commit。
近来稍有时间研究了下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$i<count($sqls)$i++){
$result[$i]
=
$db
->
query($sqls[$i])
}
//解析SQL执行结果数组
for
($j=0$j<count($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 *** 作基本完成,谢谢大家!
/*** 启动事务
* @return bool
*/
public function begin()
{
if ($this->transDepth == 0)
{
$this->query('START TRANSACTION')
}
$this->transDepth++
return TRUE
}
/**
* 事务提交
* @return bool
*/
public function commit()
{
if ($this->transDepth > 0)
{
$result = $this->query('COMMIT')
$this->transDepth = 0
if(!$result) die("err:trans commit ".mysql_error())
}
return TRUE
}
/**
* 事务回滚
* @return bool
*/
public function rollback()
{
if ($this->transDepth > 0)
{
$result = $this->query('ROLLBACK')
$this->transDepth = 0
if(!$result) die("err:trans commit ".mysql_error())
}
return TRUE
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)