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中起作用还要设置表的引擎模式。