多久COMMIT /通过访问VBA执行。在甲骨文
我跑在Access/VBA下面的代码插入到一个Oracle表(SQL修剪的效果,但需要2条独立的语句)多久COMMIT /通过访问VBA执行。在甲骨文
Dim mydb As DAO.Database
Dim myq As DAO.QueryDef
Set mydb = DBEngine.Workspaces(0).Databases(0)
Set myq = mydb.CreateQueryDef("")
With myq
.SQL = "INSERT INTO tbltrailnew..."
.Execute 'Execute SQL
.SQL = "Commit" 'Commit changes to database
.Execute 'Execute SQL
.SQL = "INSERT INTO tbltrailnew..."
.Execute 'Execute SQL
.SQL = "Commit" 'Commit changes to database
.Execute 'Execute SQL
.Close 'Close connection
End With
由于我不熟悉Oracle,我的问题是 - 我是否正在执行并提交不必要的次数?如果是这样,我的代码如何被剥离?
虽然@StephaneM有一点,这是我的看法:
是的,当你基本上只是在做一个链接操作,你可以提交一次,通常,这比犯下多次更好。
提交只是意味着:确保我刚才所做的每件事都永久写入数据库。如果你在上面发布的子程序中途失败,并且你已经提交了一些插入,你不能重新运行子程序,否则你会犯它两次。
如果你在子的末尾提交,如果运行时发生错误,你可以再次运行它。
删除您的第一次提交是我会改变的。
它实际上不是Oracle相关的问题。这一切都与你的数据有关。你应该问自己的问题是,如果插入失败,该怎么办?我应该执行另一个插入吗?我应该回滚/不执行其他插入?
只需选择将使数据库保持一致状态的解决方案。
一般而言,您应该在每次交易之后提交。从你的例子看来,在一个表中插入两个应该是两个事务,所以你最终应该只有一个提交。
一个简单的比喻是什么应该定义一个交易是一个ATM灰取消。每按一下按钮,直至取现点,构成一笔交易。一旦你收到你的现金,你会有一个COMMIT。如果你没有收到你的现金,那是一个ROLLBACK。每按一次按钮都不能成为交易,否则你可能会在要钱的时候犯下错误,然后不能收到现金。
过度提交可能会导致问题,因为Oracle必须在后台执行大量工作才能将事务写入磁盘。如果一行中有大量的插入,比如数据加载,我们通常会在大约5000到10000之后提交。对于大量的删除,这是相同的。
您还可以研究如何使用BULK COLLECT和FORALL/INSERT,以最大限度地减少服务器和客户端之间的往返行程。只有当您计划进行大量的DML(插入/更新/删除)时才这样做。
无论您是否正确提交归结为您的应用程序的设计。关于数据库事务/逻辑工作单元的一些阅读将给你可应用于任何应用程序的原则。 – BriteSponge