MyISAM转为InnoDB并在ThinkPHP中使用存储过程

时间:2022-09-24 16:33:14

一、将数据库由MyISAM转为InnoDB

1、导出CentOS数据库的表结构
#mysqldump -uroot -p test > test.sql
 
2、替换zjy_b2b_db_table.sql里的MyISAM为INNODB
#sed -i 's/MyISAM/INNODB/g' test.sql
 
3、备份好数据库,将数据库里所有表删除
 
4、将处理好的数据库重新导入
#mysql -uroot -p test < test.sql
 
PS:查看是否为innodb
#mysql -uroot -p
输入密码,进入mysql
mysql>show databases;
mysql> use test;
mysql>show table status;
可以看到所有表的存储引擎已全部改为InnoDB
 
PS:Navicat新建表可选引擎为InnoDB

二、ThinkPHP中用存储过程

使用方法:
1、启动事务:
$Model->startTrans(); 
2、提交事务
$Model->commit();
3、事务回滚
$Model->rollback();
 
(事务是针对数据库本身的,所以可以跨模型操作的 。)
实例:(充值过程)
$this->id=123;
$amount=456;
$Model=D('User');
$Model->startTrans(); //开启事务
$condition['id'] = $this->id;
$result=$Model->where($condition)->setInc('amount',$amount);
$result2=M('Some')->add(array('id'=>$this->id,'amount'=>$amount,'time'=>time()));
//如果写入User表余额失败,则Some表不写入,回滚。
if($result===false) {
    $Model->rollback(); //回滚
    \Think\Log::write('未能写入User表','WARN');
    header("location: ".SELF_URL."/some_url");exit;
}
//如果 Some表不能写入,记录到日志
if($result2===false) {
    //此处应记录到日志
    \Think\Log::write('未能写入Some表','WARN');
}
//提交
$Model->commit();
\Think\Log::write('用户ID:'.$this->id.'成功充值了'.$amount.'元','WARN');
header("location: ".SELF_URL."/some_url");exit;