PHP的PDO事务与自动提交

作者:php参考手册 时间:2023-06-09 02:32:55 

PHP PDO 事务与自动提交

现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。

事务支持四大特性(ACID):

  • 原子性(Atomicity)

  • 一致性(Consistency)

  • 隔离性(Isolation)

  • 持久性(Durability)

通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。

事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。

事务通常是通过把一批更改"积蓄"起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。

换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。

不幸的是,并非每种数据库都支持事务,因此当第一次打开连接时,PDO 需要在所谓的"自动提交"模式下运行。

自动提交模式意味着,如果数据库支持,运行的每个查询都有它自己的隐式事务,如果数据库不支持事务,则没有。

如果需要一个事务,则必须用PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。

一旦开始了事务,可用PDO::commit()PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。

注意:PDO

仅在驱动层检查是否具有事务处理能力。如果某些运行时条件意味着事务不可用,且数据库服务接受请求去启动一个事务,PDO::beginTransaction()将仍然返回 TRUE 而且没有错误。 试着在 MySQL 数据库的 MyISAM 数据表中使用事务就是一个很好的例子。

当脚本结束或连接即将被关闭时,如果尚有一个未完成的事务,那么 PDO 将自动回滚该事务。这种安全措施有助于在脚本意外终止时避免出现不一致的情况——如果没有显式地提交事务,那么假设是某个地方出错了,所以执行回滚来保证数据安全。

注意:只有通过PDO::beginTransaction()启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。

在事务中执行批处理:

在下面例子中,假设为新员工创建一组条目,分配一个为23的ID。除了登记此人的基本数据之外,还需要记录他的工资。

两个更新分别完成起来很简单,但通过封闭在PDO::beginTransaction()PDO::commit()调用中,可以保证在更改完成之前,其他人无法看到这些更改。

如果发生了错误,catch 块回滚自事务启动以来发生的所有更改,并输出一条错误信息。


<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
  array(PDO::ATTR_PERSISTENT => true));
echo "Connected\n";
} catch (Exception $e) {
die("Unable to connect: " . $e->getMessage());
}
try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
  values (23, 50000, NOW())");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
?>

并不局限于在事务中更改,也可以发出复杂的查询来提取数据,还可以使用那些信息来构建更多的更改和查询;当事务激活时,可以保证其他人在操作进行当中无法作出更改。

标签:php,pdo,事务,自动提交
0
投稿

猜你喜欢

  • SQLServer触发器调用JavaWeb接口的过程详解

    2024-01-17 12:08:45
  • 兼容主流浏览器,纯CSS下拉菜单

    2010-09-05 20:30:00
  • Python判断有效的数独算法示例

    2021-10-09 06:37:37
  • Python映射类型之dict详解

    2023-08-03 13:19:19
  • python中的字典操作及字典函数

    2023-02-06 05:17:42
  • 5个Python杀手级的自动化脚本分享

    2022-11-21 12:03:54
  • Python基于argparse与ConfigParser库进行入参解析与ini parser

    2022-09-16 01:56:39
  • 预防PHPDDOS的发包攻击别人的方法(iis+linux)

    2023-10-14 04:09:34
  • Python对列表去重的多种方法(四种方法)

    2023-03-18 23:38:19
  • MySQL按天分组统计一定时间内的数据实例(没有数据补0)

    2024-01-17 07:42:08
  • 不受欢迎的“欢迎页”

    2008-04-20 16:41:00
  • python实现删除列表中某个元素的3种方法

    2023-02-08 16:01:59
  • Python NLP开发之实现聊天机器人

    2021-12-21 18:04:48
  • 浅谈python3打包与拆包在函数的应用详解

    2022-03-05 00:33:15
  • Pycharm以root权限运行脚本的方法

    2022-03-16 12:23:51
  • 详解在Python的Django框架中创建模板库的方法

    2023-08-15 10:32:56
  • python selenium 查找隐藏元素 自动播放视频功能

    2022-03-01 18:54:14
  • 使用setup.py安装python包和卸载python包的方法

    2023-01-31 02:20:47
  • 在Python中等距取出一个数组其中n个数的实现方式

    2023-10-18 10:03:10
  • 6个网站改版时需要注意的问题

    2010-02-26 10:47:00
  • asp之家 网络编程 m.aspxhome.com