单笔交易 vs 多笔交易

3

我需要将数据插入到同一数据库中的两个不同表中。目前,我使用单独的查询/事务来进行每个插入,但最近我了解到可以将这两个插入组合成一个单独的事务。

将它们组合成一个事务与保持它们为单独的事务有什么区别?


1
使用事务更好,因为如果第二个插入失败,您不会使数据库处于不一致的状态 - 您将回滚(撤消)第一个插入。 - Nikola Markovinović
你打算通过事务实现什么? - Madman
4
谁投票关闭的?这可能是一个新手问题,但是还算不错。 - Tony Hopkinson
1
@TonyHopkinson:+1:是的,我也这么想。 :) - A_nto2
4个回答

10

事务提供了回滚 SQL 语句的功能。例如,你有两个表 table1 和 table2,只有在将数据正确插入 table1 后才想要将其插入 table2。如果向 table1 插入数据时出现错误,则不会将数据插入 table2。在这种情况下,你需要使用事务。

事务的四个基本函数:

  1. 原子性:当一个事务涉及到两个或多个数据对象时,所有的数据操作要么全部提交成功,要么全部失败回滚。
  2. 一致性:事务执行结束后,数据要么被更新为一个新的有效状态,要么回滚到原始状态。
  3. 隔离性:在一个事务中,在提交或回滚之前,所访问的数据必须得到隔离并且不能被其他事务访问。
  4. 持久性:在事务提交后,即使服务器崩溃或重启,数据的最终状态仍然可用。

4
如果数据相关联,也就是说第二个 SQL 存储的数据依赖于第一个查询中存储的数据或者反之亦然,那么你应该考虑使用 transaction。这样一来,如果其中一个查询遇到问题,你可以进行 rollback。你可以在 try-catch 语句中实现此功能。如果两个查询完全没有关联,则可以使用两个独立的 SQL 语句。
然而,我认为,由于两个表格中的数据相同,最好还是采用 transaction。这样,在未来进行类似连接、删除等操作时,你将拥有一个一致的数据库。

1

一件事情与另一件事情没有任何关系。

将它们放在同一个事务中的意义在于,两者要么同时发生,要么都不发生。

如果您的第一个插入成功而第二个插入失败,那么您会陷入什么境地是您需要问自己并回答的问题。

就我个人而言,既然我在某个操作中执行了这两个插入操作,即使第二个插入操作失败的后果在其他地方得到处理,单个事务也是有意义的。


1

您需要对这两个插入操作进行原子性执行吗(即它们必须同时成功或失败,而不能一个成功一个失败)?

  • 如果是,则必须将它们包含在同一事务中。
  • 如果不是,则可以根据以下描述进行选择...

事务是ACID的,“D”代表"持久性",实际上意味着DBMS必须等待数据被物理写入永久存储器(而不仅仅是存储在缓存中并立即继续执行)。出于性能原因,您希望这种“持久性等待”相对较少,并且使用一个事务而不是两个事务(每个语句一个)在这方面更好。当然,这将使它们具有原子性,这可能是可取的,也可能不是,因此您必须在性能和所需行为之间取得平衡。


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