Sql 单笔交易与多笔交易
我需要将数据插入同一数据库中的两个单独的表中。我目前正在为每个插入使用单独的查询/事务,但我最近了解到,我可以将两个插入合并到一个事务中Sql 单笔交易与多笔交易,sql,database,transactions,Sql,Database,Transactions,我需要将数据插入同一数据库中的两个单独的表中。我目前正在为每个插入使用单独的查询/事务,但我最近了解到,我可以将两个插入合并到一个事务中 将它们合并到一个事务中而不是将它们作为单独的事务保留有什么区别?一件事与另一件事无关 将它们放在同一事务中的意义在于两者都发生或两者都不发生 如果您的第一次插入成功,而第二次插入失败,那么您需要问和回答的问题是,这会给您留下什么 就我个人而言,由于我在某个操作中同时进行了两次插入,即使第二次插入失败的后果在其他地方得到处理,单个事务也是有意义的。事务为您提供了
将它们合并到一个事务中而不是将它们作为单独的事务保留有什么区别?一件事与另一件事无关 将它们放在同一事务中的意义在于两者都发生或两者都不发生 如果您的第一次插入成功,而第二次插入失败,那么您需要问和回答的问题是,这会给您留下什么
就我个人而言,由于我在某个操作中同时进行了两次插入,即使第二次插入失败的后果在其他地方得到处理,单个事务也是有意义的。事务为您提供了回滚sql语句的工具。例如,您有两个表table1和table2,您只想在table2中正确插入数据,如果在table1中插入数据时发生错误,您将不会在table2中插入数据,在这种情况下,您将使用事务 交易的四个基本功能:
原子性:
当一项交易涉及两条或多条信息时,要么提交所有PEICE,要么不提交任何PEICE一致性:
在事务结束时,要么存在新的有效数据形式,要么将数据返回到原始状态隔离:
在事务期间(提交或回滚之前),数据必须保持隔离状态,其他事务无法访问持久性:
事务提交后,即使服务器出现故障或重新启动,数据的最终状态仍然可用如果数据是相关的,这意味着由第二个SQL所存储的数据以某种方式与第一个查询所存储的数据相联系,反之亦然,则应该考虑编写<代码>事务< /代码>。这样,如果其中一个查询遇到问题,您就可以
回滚。您可以在try-catch
语句中实现这一点。如果查询彼此完全不相关,则可以使用两个单独的SQL语句
但是,我认为,由于两个表的数据相同,因此最好执行一个事务。因此,如果将来您必须执行诸如联接、删除等操作,那么您仍然有一个一致的数据库。您是否需要以原子方式执行这两个插入(即,它们必须同时成功或失败,但不能一个成功,另一个失败)
- 如果是,则必须将其包含在同一交易中
- 如果没有,那么你在选择上有一定的自由度,如下所述
事务是,而“D”代表,这在实践中意味着DBMS必须等待数据被物理写入永久存储器(而不仅仅是将其存储在缓存中并立即移动)。出于性能原因,您希望这种“持久性等待”相对较少,在这方面,使用一个事务而不是两个事务(每个语句一个事务)更好。当然,这会使它们原子化,这可能是可取的,也可能不是可取的,因此您必须平衡性能和所需的行为。事务更好,因为如果第二次插入失败,您不会使数据库处于不一致的状态-您将回滚(撤消)也请先插入。您将通过交易实现什么?谁投票关闭?可能是个新手问题,但这是个不错的问题。@TonyHopkinson:+1:是的,我也这么认为。:)@WaqarJanjua:谢谢你的提示:)