当前位置: 首页 > 面试题库 >

了解pdo mysql事务

窦凯定
2023-03-14
问题内容

在PHP文件说:

如果您以前从未遇到过事务,则它们提供4个主要功能:原子性,一致性,隔离性和持久性(ACID)。用外行的术语来说,事务中执行的任何工作,即使它是分阶段进行的,都可以保证在提交时安全地应用于数据库,并且不受其他连接的干扰。

题:

这是否意味着我可以让两个单独的php脚本同时运行事务,而又彼此不干扰?

通过干扰细化我的 意思

假设我们有下employees表:

 __________________________
|  id  |  name  |  salary  |
|------+--------+----------|
|  1   |  ana   |   10000  |
|------+--------+----------|

如果我有两个脚本具有相似/相同的代码,并且它们在完全相同的时间运行:

script1.phpscript2.php (两者具有相同的代码):

$conn->beginTransaction();

$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit();

并假设事件的顺序如下:

  • script1.php 选择数据

  • script2.php 选择数据

  • script1.php 更新数据

  • script2.php 更新数据

  • script1.php commit()发生

  • script2.php commit()发生

在这种情况下,ana的薪水是多少?

  • 会是11000吗?然后这是否意味着1个事务将与另一个事务重叠,因为该信息是在任一提交发生之前获得的?

  • 会是12000吗?那么这是否意味着无论更新和选择数据的顺序如何,commit()函数都会强制这些操作单独发生?

请随意详细说明事务和单独的脚本如何相互干扰(或不干扰)。


问题答案:

您不会在php文档中找到答案,因为这与php或pdo无关。

mysql中的Innodb表引擎提供了4个所谓的与sql标准一致的隔离级别。隔离级别与阻塞/非阻塞读取一起将确定上述示例的结果。您需要了解各种隔离级别的含义,并根据需要选择合适的隔离级别。

总结一下:如果在自动提交关闭的情况下使用可串行化的隔离级别,则结果将为12000。在所有其他隔离级别和启用自动提交的可串行化的情况下,结果将为11000。如果开始使用锁定读取,则结果可能是在所有隔离级别下为12000。



 类似资料:
  • 问题内容: 我正在尝试通过以下示例来消除我对Spring Transaction边界的怀疑。 我想将test2()方法与test1()隔离开,即每次调用test()时,test2()都不应读取test1()提交的数据。请建议是否可以使用传播或隔离属性来处理这种情况。 提前致谢。 问题答案: 事务属性应用于外部调用,而不是由bean方法(例如您的案例)进行的内部调用。如果要将事务边界应用于调用,则应

  • 问题内容: 我正在考虑,这是我想到的: 假设我们有这样的代码: 一个请求进入,并且JS引擎逐步开始执行上述代码。前两个呼叫是同步呼叫。但是当涉及到方法时,它将成为异步执行。但是JS立即从中返回并继续执行,这称为或。并且它继续在其他等等上工作。 执行结果如下: 交流数据库 因此,基本上第二个首先完成,其回调函数比第一个早执行,这是有道理的。 我们在这里谈论单线程应用程序。JS Engine会继续执行

  • 本文向大家介绍谈谈你对 Kafka 事务的了解?相关面试题,主要包含被问及谈谈你对 Kafka 事务的了解?时的应答技巧和注意事项,需要的朋友参考一下 为什么要提供事务机制 Kafka事务机制的实现主要是为了支持 即正好一次语义 操作的原子性 有状态操作的可恢复性 《Kafka背景及架构介绍》一文中有说明Kafka在0.11.0.0之前的版本中只支持和语义,尚不支持语义。 但是在很多要求严格的场景

  • 问题内容: 我无法确切了解其功能。我以为自己了解了,但似乎无法复制自己的感觉: 虽然是循环的,我会寄过来几个请求,假设将排队几次身后有只在被排队完成。 如果我对它的工作方式是正确的,我认为结果将如下所示: 但这不是连续的: 我看到这是在执行之前返回的,这是预期的,但似乎是NEXT在行,而不是在队列的末尾,在所有请求的后面。这是它的工作方式吗?也许我只是不了解节点中事件队列的工作原理。而且请不要在这

  • 看看这篇关于水印的文章 在那篇文章的后面,它解释了当设置允许迟到时: Flink不会丢弃邮件,除非它超过了window\u end\u允许的延迟时间 由于设置了允许的延迟,是否实际导致了对窗口的延迟评估? 那么水印和允许迟到的用法到底有什么不同呢?什么时候使用哪个?

  • 本文向大家介绍简单了解Spring中的事务控制,包括了简单了解Spring中的事务控制的使用技巧和注意事项,需要的朋友参考一下 1.事务的概念 事务是一组操作的执行单元,相对于数据库的单条操作而言,事务管理的是一组SQL指令,如增删改查等,事务的特性体现在事务内包含的SQL指令必须全部执行成功,如果其中一条指令发生错误,那么整个事务内的一组操作都要进行回滚。 事务有四个特性: 原子性 Atomic