一、将数据库由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;