PDO中事物详解

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值