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中PDO的MYSQL事务处理实例
- PHP中PDO的MYSQL事务处理实例
- PHP中PDO的MYSQL事务处理实例
- 解析php mysql 事务处理回滚操作(附实例)
- PHP mysql 事务处理实例
- PHP mysql 事务处理实例
- php利用pdo进行mysql的事务处理机制
- php+Mysqli利用事务处理转账问题实例
- PHP 处理 MySQL INNODB 事务回滚(ThinkPHP、MySQL、PDO)
- 解析php mysql 事务处理回滚操作(附实例)
- 解析php mysql 事务处理回滚操作(附实例)
- PHP mysql 事务处理实例
- PHP mysql 事务处理实例
- 解析php mysql 事务处理回滚操作(附实例)
- php的PDO事务处理机制实例分析
- 跟着百度学PHP[14]-PDO之Mysql的事务处理1
- php利用pdo进行mysql的事务处理机制
- 跟着百度学PHP[14]-PDO之Mysql的事务处理2
- PHP mysql 事务处理实例
- 网站建设PHP mysql 事务处理实例