PDO中事物详解

来源:互联网 发布:蝴蝶战法指标公式源码 编辑:程序博客网 时间:2024/05/22 00:48

PDO中事物与其他编程语言类似,采用开始事物,提交事物,回滚的流程模式,但是在使用mysql作为插入或者修改的数据库时需要注意,需要将MySQL中的表的引擎设置为Innodb模式,MySQL中表有两种模式,一种是myisam模式,一种是Innodb模式。简单地说,前者不支持事物,后者支持事物。所以在PDO的事务处理中,前者类型的表不支持事务,即便在代码中写了相应的事务处理代码。所以需要对表引擎设置成Innodb模式。

实例:

表中数据

mysql> select * from bank;
+----+-------+------+
| id | name  | sum  |
+----+-------+------+
|  1 | wang  | 1500 |
|  2 | zhang | 1500 |
+----+-------+------+
2 rows in set (0.00 sec)

对一个表中的两条记录更新。(此时表为默认的MyIsam模式)
$pdo=new PDO('mysql:host=localhost;dbname=myphp','root','123456');$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);try {    $pdo->beginTransaction();//开始事物    $sql1='update bank set Sum=Sum-500 where id=2';    $sql2='update bank set Sum=Sum+500 where id=5';//注意此处对id=5的数据操作,但并不存在id=5的数据    $res1=$pdo->exec($sql1);    if($res1==0)    {        throw new PDOException('Error in zhang');    }    $res2=$pdo->exec($sql2);    if($res2==0)    {        throw new PDOException('Error in wang');    }    $pdo->commit();//提交事物}catch (PDOException $e){    $pdo->rollBack();    echo $e->getMessage();}

执行结果:

mysql> select * from bank;
+----+-------+------+
| id | name  | sum  |
+----+-------+------+
|  1 | wang  | 1500 |
|  2 | zhang | 1000 |
+----+-------+------+
2 rows in set (0.00 sec)

由此可见,表不支持事务,即使在PDO中做了相关事务的限制也无济于事。


下面需要把表的引擎模式改成Innodb:

 alter table bank engine=Innodb;


下面是新的执行结果:

mysql> select * from bank;
+----+-------+------+
| id | name  | sum  |
+----+-------+------+
|  1 | wang  | 1500 |
|  2 | zhang | 1500 |
+----+-------+------+
2 rows in set (0.00 sec)

这次执行后,表中的额数据都没有发生变化,说明还是PDO中事物在mysql中起作用还要设置表的引擎模式。

0 0
原创粉丝点击