您的位置:首页 > 编程语言 > PHP开发

php事务处理mysql与PDO实例

2017-12-08 22:20 726 查看

MySQL事务处理

MySQL对事务的支持:

被操作的表必须是innoDB类型的表(支持事物)

MySQL常用的表类型:MySAM(非事物)增删改速度快,InnodB(事务型)安全性高

如果mysql表不是innoDB需要修改表的类型为innoDB。

修改方法是:

mysql> alter table mytable engine=innodb;


mysql命令行事务处理:

默认的mysql表的事务处理与自动提交是关着的,如果想让mysql表有事务处理就先需要先把自动提交关掉,然后开启事务

关闭自动提交方法:

mysql>set autocommit=0;
Query OK, 0 rows affected <0.00 sec>


开启事务:

mysql>start transaction;
Query OK, 0 rows affected <0.00 sec>


当开启事务后假设现在想删除一条语句

mysql>delete from mytable where id=1;
Query OK , 1 rows affected <0.00 sec>


这个时候还不是真正的删除这条语句所以可以使用roolback返回之前删除的内容。

mysql>roolback;
Query OK, 0 rows affected <0.05 sec>


如果想真正的删除这条id为1内容,执行完删除语句之后还需要在执行以下commit 才算是真正的删除

mysql>commit;
Query OK, 0 rows affected <0.05 sec>


PHP程序里的PDO事务处理:

配置事物处理

1. 关闭PDO自动提交:

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);


2. 开启一个事务需要的方法:

$pdo->beginTransaction(); //开启事物
$pdo->commit(); // 提交事务
$pdo->rollback(); // 回滚事务


注意: 只有通过 PDO::beginTransaction() 启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。

3. 一般事务处理是运行在try{…..}catch{….}语句中:

在下面例子中,假设A转账给B。

两个更新分别完成起来很简单,但通过封闭在 PDO::beginTransaction() 和PDO::commit() 调用中,可以保证在更改完成之前,其他人无法看到这些更改。

如果发生了错误,catch 块回滚自事务启动以来发生的所有更改,并输出一条错误信息。

try{
//创建对象
$pdo=new PDO("mysql:host=localhost:3306;dbname=mydb","root","password");
//设置错误使用异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
//array(PDO::ATTR_AUTOCOMMIT=>0));   //也可以使用这个方法关闭自动提交
}catch(PDOException $e){
echo "Unable to connect:".$e->getMessage();
}

try{

//在事务中执行批处理:
$pdo->beginTransaction();  //开启事物
$price=10;   //十块钱
//A转出10元
$rows=$pdo->exec("update mytable set money=money-{$price} where id=10");
if($affected_rows>0){
echo "A转出{$price}元!<br/>";
}else{
throw new PDOException("A转出失败!<br/>");
}
//B收到10元
$rows=$pdo->exec("update mytable set money=money+{$price} where id=22");
if($affected_rows>0){
echo "B收到{$price}元";
}else{
throw new PDOException("B收取失败!<br/>");
}
echo "交易成功!<br/>";

//提交以上操作
$pdo->commit();

}catch(PDOException $e){
echo "错误:".$e->getMessage();
echo "交易失败!<br/>";
$pdo->roolback();  //撤销所有的操作并返回修改的数据内容
}
//运行完成以后,最后开启自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);


注意:在整个程序中有一部分是需要自动提交的所以在整个代码执行完了之后需要开启自动提交
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php mysql pdo 实例