PHP之事务四大特性 及 事务操作实例(PDO)

一、为什么要使用事务
    事务是一组不可被分割执行的SQL语句集合,如果有必要,可以撤销。银行转账是经典的解释事务的例子。用户A给用户B转账5000元主要步骤可以概括为如下两步。 
  第一,账户A账户减去5000元; 
  第二,账户B账户增加5000元; 
  这两步要么成功,要么全不成功,否则都会导致数据不一致。这就可以用到事务来保证,如果是不同银行之间的转账还需要用到分布式事务
二、事务的四大特性
事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。 
  1、原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。 
  2、稳定性:数据库在事务执行前后状态都必须是稳定的。 
  3、隔离性:事务之间不会相互影响。 
  4、持久性:事务一旦提交,其结果是永久的。

三、开启一个事务需要的方法
$pdo=实例pdo的对象;
$pdo->beginTransaction(); // 开启一个事务  
$pdo->commit(); // 提交事务  
$pdo->rollback(); // 回滚事务  
四、PDO事务实例【新建张表 模拟数据bank_balance是余额】
数据库:

代码实现:

<?php
//连接数据库
$dsn="mysql:dbname=test;host=localhost";
//数据库的用户名
$user="root";
//数据库的密码
$pwd="root";
//生成PDO对象
$db = new PDO($dsn, $user, $pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';")); //初始化一个PDO对象
//开启事务进行数据处理
try {
    $db->beginTransaction(); // 开启一个事务
    $row = null;
    $row = $db->exec("update transfer set bank_balance=bank_balance-10 where name='杜甜甜'"); // 执行第一个 SQL
    if (!$row)
        throw new PDOException('转账失败'); // 如出现异常提示信息或执行动作
        $row = $db->exec("update transfer set bank_balance=bank_balance+6 where name='温书记'"); // 执行第二个 SQL
 
    if (!$row)
        throw new PDOException('温书记收款失败'); // 如出现异常提示信息或执行动作
        $row = $db->exec("update transfer set bank_balance=bank_balance+4 where name='邱老板'"); // 执行第二个 SQL
 
    if (!$row)
        throw new PDOException('邱老板收款失败'); // 如出现异常提示信息或执行动作
 
    $db->commit();  //提交事务
} catch (PDOException $e) {
    $db->rollback(); // 执行失败,事务回滚
    exit($e->getMessage());
}
 
//展示数据库数据的表格 方便查看  也可以直接查看数据库数据动态
try{
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $count = $db->query("select * from transfer");
    $count->setFetchMode(PDO::FETCH_ASSOC);
    $data = $count->fetchAll();
}catch(PDOException $e){
    die ("Error!: " . $e->getMessage() . "<br/>");
}
?>
 
<h4>余额展示</h4>
<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['bank_balance'];?></td>
        </tr>
    <?php }?>
</table>
执行完毕:

原文:https://blog.csdn.net/DuTianTian_csdn/article/details/80396350 
 

猜你喜欢

转载自blog.csdn.net/qq_25861247/article/details/86488146