处理多个存储过程调用的事务
我有一个 .Net 3.5 winforms 应用程序,其中运行多个步骤。 每一步都会进行一些计算并调用一个或多个存储过程。其中一些存储过程会在 Oracle 数据库的表中进行多次更新/插入。
应用程序 UI 的每个步骤都有“处理”和“取消处理”按钮。如果用户点击取消处理按钮,应用程序应该将数据库状态回滚到之前的状态……即。使交易原子化。
所以,我的问题是,这可能吗?如果是的话,为了实现这种原子性,我需要在应用程序和数据库端处理哪些事情?
我需要在这里使用.Net的事务API吗?另外,是否需要在这些存储过程中使用BEGIN/COMMIT TRANSACTION块?
请分享您的想法。
谢谢。
I've a .Net 3.5 winforms application in which am running multiple steps.
Each step does some calculation and calls one or more stored procs.Some of these stored procs do multiple updates/inserts in the tables in the oracle database.
App UI has "process" and "cancel process" buttons for each step.If the use hits cancel process button, the application is supposed to rollback the database state to its previous state...ie. make the transaction ATOMIC.
So, my question here is, is this possible..?and if yes, to achieve this atomicity, what all things I need to take care of in the app and db side?
Do I need to use .Net's transaction API here?Also, is it required to use BEGIN/COMMIT TRANSACTION blocks in those stored procs??
Please share your thoughts.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,是的,其次,您的 C# 应用程序(特别是任务层)应该管理事务,存储过程不应该是事务性的,除非您可以保证能够执行在父级回滚时回滚的嵌套事务(我可以'不要谈论这一点 WRT oracle)
http://msdn.microsoft .com/en-us/library/system.data.oracleclient.oracleconnection_methods%28v=VS.71%29.aspx
使用您的 OracleConnection 对象,之前你开始所有的工作,调用 BeginTransaction()。然后使用该连接执行所有 OracleCommand 操作。
然后,如果您调用 Transaction.RollBack 或 Transaction.Commit 您所做的所有存储过程工作都应该回滚或提交。
链接中的示例:
First, yes, and second, your C# app (specifically the task layer) should manage the transactions, the sprocs should NOT be transactional unless you can guarantee the ability to do nested transactions that roll back when the parent rolls back (and I can't speak on that point WRT oracle)
http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection_methods%28v=VS.71%29.aspx
With your OracleConnection object, before you begin all your work, call BeginTransaction(). Then do all your OracleCommand operations with that connection.
Then if you call Transaction.RollBack or Transaction.Commit all sproc work you do should roll back or commit.
Example right from the link: