3

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

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

4

4 回答 4

10

Well Transaction 为您提供了回滚 sql 语句的工具。例如你有两个表table1和table2,你想在table2中插入数据只有正确插入table1,如果在table1中插入数据发生错误你不会在table2中插入数据,在这种情况下你将使用交易。

交易的四个基本功能:

  1. Atomicity:当事务中涉及两条或更多条信息时,要么提交所有信息,要么不提交任何信息。
  2. Consistency:在事务结束时,要么存在新的有效数据形式,要么数据返回到其原始状态。
  3. Isolation:在事务期间(在提交或回滚之前),数据必须保持隔离状态,其他事务无法访问。
  4. Durability:事务提交后,即使服务器出现故障或重新启动,数据的最终状态仍然可用。
于 2012-07-12T12:21:51.320 回答
4

如果数据是相关的,这意味着第二个 sql 存储的数据依赖,以某种方式与第一个查询存储的数据链接,反之亦然,那么你应该考虑制作一个transaction. 这样,rollback如果其中一个查询遇到问题,您就可以。try-catch您可以在语句中实现这一点。如果查询彼此完全不相关,则可以使用两个单独的 SQL 语句。

但是我认为,由于两个表的数据相同,因此最好进行事务处理。因此,如果您将来必须进行连接、删除等操作,那么您已经拥有了一个一致的数据库。

于 2012-07-12T12:26:03.670 回答
1

您是否需要以原子方式执行这 2 次插入(即它们必须都成功或失败,但您不能让一个成功而另一个失败)?

  • 如果是,那么您必须将它们包含在同一个事务中。
  • 如果不是,那么您有一定的选择余地,如下所述...

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

于 2012-07-12T12:31:36.760 回答
1

一件事与另一件事无关。

将它们放在同一个事务中的目的是要么都发生,要么都不发生。

如果您的第一个插入成功而第二个插入失败,那么您需要问和回答的问题是什么。

就个人而言,由于我在某些操作中同时进行了两次插入,因此即使第二个事务失败的后果在其他地方处理,单个事务也是有意义的。

于 2012-07-12T12:20:21.013 回答