何时应在查询中使用事务?

43

我正在阅读有关如何在数据库类型和数据库引擎中使用事务的非常详细的教程,但是我没有找到一份指南教我何时以及为什么要使用它们。

我知道事务通常用于银行业务,在处理金融数据时使用,但我可以想象它们还用于许多其他方面。

今天我正在为关系型数据库编写包含各种INSERT语句的页面,并且我想知道这是否是应该使用它们的情况之一。

我有一种印象,即我不知道在哪些情况下数据可能会部分丢失(除了编码错误),因此我总是担心何时应该使用它们。

有人能否解释或提供一些基本规则的链接?

我正在使用MySQL 5.0.8。我应该为所有需要事务的表使用InnoDB吗?如果是这样,是否比常见的MyISAM更慢,但我不必担心这个问题?

谢谢

7个回答

29

感谢您的帮助,我在这里也找到了一些处理事务的技巧:http://www.kennynet.co.uk/2008/12/02/php-pdo-nested-transactions/。 - vitto
1
在这里寻找一些优秀的答案,实际上有几个投票很高但质量很差的答案。 - maxkoryukov

15

除了Nick Craver所写的内容外,当您需要执行一系列需要原子性执行的写操作时,您需要使用事务;也就是说,它们都应该成功或者全部失败。


12

当存在以下情况时,应使用事务处理技术:未能完成或其他人在执行任务期间进行读写可能会导致数据损坏。这些情况包括但不限于:

  • 从表中读取以备删除
  • 将相关数据写入多个表格

6

当您有一组必须是原子性的操作(要么全部成功,要么全部失败)时,您需要使用事务。将这些操作封装在事务中允许您在遇到错误时回滚已经成功的操作。它还确保您正在处理的数据是一致的,因为锁定将保持到事务完成为止。


1
在一些框架中,比如Spring,自动事务允许在事务失败时重新执行。

0
当手动操作敏感数据库时,使用事务作为安全/验证步骤来验证对表所做的更改是否正确且符合意图也是一个好主意。这可以避免因错误而保存不良数据。
例如:
我更新表A并将字段x无意中设置为错误值,覆盖了先前的正确值。
如果我在事务内部,我将能够选择我的行并检查我的更改,发现错误并回滚。如果我的行看起来正确,那么我就会提交。
如果我不在事务内部,我将失去正确的值。

在更新之前验证数据不是更容易吗? - Your Common Sense
当然可以,而且你应该这样做。我说的是“无意中”设置了错误的值,难道你从来没有犯过错吗?这就是我的意思,你可以回滚一个错误。没有人会故意犯错。 - Medhat Gayed
看,这不是关于“错误”的问题。而是关于你在哪里检查它们的问题。在你的情况下,你设置了错误的值,选择它并回滚。当你可以简单地检查该值并根本不插入时,这毫无意义。 - Your Common Sense
同意,你的观点对于简单操作和非常谨慎有经验的用户来说是正确的,然而有些情况可能更加微妙难以察觉,例如意外省略/忘记where子句,我指的是新手/初学者犯的错误。 - Medhat Gayed
1
现在我明白了。这不是针对代码的,通常我们在实现事务时使用,而是针对当您被要求对实时数据库进行一次性更改的情况。 - Your Common Sense

0

主要用于多个相同的CRUD情况,其中您想要保存有效条目的更改,对于具有多个输入的多步骤表单的每个步骤的多个输入的情况下,以及在获得外部API反馈后提交表单之后.. 主要是当您想要撤消某些返回值的查询时。


如果两个用户尝试提交相同的表单,会发生什么情况?你不会遇到锁定错误吗? - javanoob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接