PHP事务特性

一、概述:事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据应用该组查询的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
事务的四大特性(ACID)

1.原子性(atomicity):一个事务中的所有语句,应该做到:要么全做,要么一个都不做。

2.一致性(consistency):让数据保持逻辑上的 “合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1.

3.隔离性(isolation):如果多个事务同时并发执行,但每个事务就像各自独立执行一样,对其他事务是不可见的。

4.持久性(durability):一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)也即所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
PDO开启事务

$pdo=实例pdo的对象;
$pdo->beginTransaction(); // 开启一个事务  
$pdo->commit(); // 提交事务  
$pdo->rollback(); // 回滚事务  

PDO事务实例【balance是账户余额】
在这里插入图片描述
示例代码:

  $dsn='mysql: host=localhost; dbname=mysql_test'; //连接数据库
    $user='root';  //数据库用户名
    $pass='root';  //数据库密码
    /*创建PDO对象*/
    $db = new PDO($dsn, $user, $pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"));

try {
    /*开启事务*/
    $db->beginTransaction();
    $row = null;
    /*执行第一个SQL*/
    $row = $db->exec("update account set balance=balance-50 where name='张总'");
    if (!$row)
        /*如出现异常提示信息或执行动作*/
        throw new PDOException('转账失败');
           /*执行第二个SQL*/
        $row = $db->exec("update account set balance=balance+20 where name='李总'");

    if (!$row)
        /*执行失败抛出提示信息*/
        throw new PDOException('李总收款失败');
          /*执行第三个SQL*/
        $row = $db->exec("update account set balance=balance+30 where name='王总'");
          
    if (!$row)
        /*如出现异常提示信息或执行动作*/
        throw new PDOException('王总收款失败');
    
    
    $db->commit();  //提交事务
} catch (Exception $e) {
    $dbh->rollBack();//事务执行失败,回滚
    echo “操作失败: ” . $e->getMessage();
}

//展示数据库数据的表格 方便查看  也可以直接查看数据库数据动态
try{
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $count = $db->query("select * from account");
    $count->setFetchMode(PDO::FETCH_ASSOC);
    $data = $count->fetchAll();
}catch(PDOException $e){
    echo “Failed: ” . $e->getMessage();
}

<h2>结果展示</h2>
<table border="1">
    <tr>
        <td>用户名</td>
        <td>余额</td>
    </tr>
    <?php foreach($data as $k => $v){?>
        <tr>
            <td><?php echo $v['name'];?></td>
            <td><?php echo $v['balance'];?></td>
        </tr>
    <?php }?>

</table>

结果展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值