一、概述:事务就是一组原子性的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>
结果展示: