是否可以在sql中的commit语句之后保存数据

时间:2011-11-01 04:12:10

标签: sql sql-server database oracle

如果有10个用户同时在一张桌子上工作(例如-A1,A2,A3 ......,A10)。每个人都在同一个表上并行执行DML操作(即插入,更新和删除)。如果用户A1在其他人执行操作时提交事务。可以保存所有的交易操作。(是/否) 如果是,那么为什么? 如果不是为什么?

3 个答案:

答案 0 :(得分:3)

没有。根据{{​​3}}隔离交易。

如果用户A1创建了一个事务,那么只有他可以提交它。这将使其他用户可以看到他的全部或全部更改。根据事务的隔离级别,其他用户只有在提交自己的活动事务后才会看到其他用户的已提交更改(请参阅ACID)。

想象一下:

我正在改变数据库中的某些东西。例如,我正在删除用户A1已更改的对象。如果他的提交也提交我的交易,会发生什么?他应该得到错误,因为对象已经/将会消失吗?或者我应该收到错误,因为该对象被其他用户修改了?

没有简单的方法来解决这些冲突。

云数据库通过保留所有对象的历史记录来解决它。因此,当用户A1更改对象并删除它时,数据库将记录两个更改但保留对象。我可以及时看到A1的变化,我也可以看到我的“删除”。

另一点:您可以编写一个服务器来同步所有用户所做的更改。因此总会只有一个交易开放。如果两个用户更改了相同的对象,您如何解决冲突?

或者您可以编写一个跟踪所有事务并将它们全部提交到一个服务器的服务器,如何确保将半有效对象写入数据库(如没有项目的订单,没有总计的发票,没有地址的客户) )?

答案 1 :(得分:2)

我不确定我理解这个问题。

所有用户都在同一行上运行吗?或者他们在不同的行上运作?如果它们在同一行上运行,则会话必然会相互锁定 - 只有一个会话可以更新一行 - 其他会话需要等待在事务提交时释放锁。如果他们在不同的行上运行,那么用户A的交易将不会对用户B产生影响 - 对我来说,在这种情况下您想要保存的“交易操作”或者您希望保存该信息的位置并不明显。 / p>

答案 2 :(得分:0)

我猜你想要的是变化的历史?在这种情况下,您可以使用自己的触发器来捕获更改,也可以使用Oracle 11g中的Total Recall