我正在尝试使用NHibernate的事务控制和FlushMode选项来实现某种嵌套事务行为,但是在阅读太多之后事情变得有点混乱,所以我在下面列出的事实的任何确认都将非常有用.
我想要的是打开一个在小事务中分裂的大事务.想象一下以下场景:
我想看看NH将INSERT和TX2 UPDATE发送到数据库,只是忽略了回滚的TX3.
我尝试使用FlushMode = Never并且只在需要正确的Begins/Commits/Rollbacks之后才刷新会话,但NH总是使用对象的最终状态更新数据库,与提交和回滚无关.这是正常的吗?使用FlushMode = Never时NH是否真的忽略了事务控制?
我还尝试使用FlushMode = Commit并打开嵌套事务,但我发现,因为ADO.NET,嵌套事务实际上总是相同的事务.
请注意,我并不是想要实现"全有或全无"的行为.我正在寻找一种保存点的工作方式.NH有没有办法(保存点)?
先感谢您.
菲利佩
下面的sproc是根据本文中的模板实现的:异常处理和嵌套事务.这个sproc应该处理死锁,它由已经创建事务的另一个sproc调用.内部事务的BEGIN/COMMIT的一些魔法是不匹配的,因为我得到了这个例外:Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.据我所知,catch被执行,@xstate = -1是真的,整个外部事务被回滚.
任何不匹配发生的想法?
CREATE PROCEDURE [dbo].[mysproc]
AS
BEGIN
SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
DECLARE @trancount int;
SET @trancount = @@TRANCOUNT;
IF (@trancount = 0)
BEGIN TRANSACTION;
ELSE
SAVE TRANSACTION InnerTran;
--
-- do some work that can potentially cause a deadlock
--
END TRY …Run Code Online (Sandbox Code Playgroud) t-sql sql-server nested-transactions sql-server-2008 sqltransaction
为了记录,我使用的是Neo4j 2.0.0-M02.
我目前有一种方法可以在其用户ID上搜索标签为"User"的节点,该用户ID作为节点属性"id"存储在图中.这一切都发生在事务中,因为它会自动关闭ResourceIterator.
现在,我想在两个用户之间创建一个关系.我只拥有他们的用户ID.现在,我显然希望重用按其ID搜索用户的方法.我有三种方法可以想到.
第一个是显而易见的.使用现有方法检索两个节点.比调用创建它们之间关系的方法.显然这也发生在一个事务中,所以这需要三个事务.效率不高.
第二个是在创建关系的新方法中重用代码(而不是方法).这样,我可以在一个事务中完成所有操作,但我复制的代码对于开发人员来说并不是一个很好的实践.
第三个是在创建关系的新方法的事务内调用现有方法两次.这样我的代码仍然可以重用,但我不确定嵌套事务在Neo4J中是如何工作的.是否会忽略现有方法的交易,因为已有现有交易?这将解决我的问题.
如果没有,我必须重新考虑我管理交易的地方.我知道在服务中管理它们通常比在DAO中更好,但我想将Neo4j的东西从我的服务类中保留下来.
我正在尝试理解SQL Server中的嵌套事务.让我们考虑以下SQL命令链:
BEGIN TRANSACTION; -- #1
BEGIN TRANSACTION; -- #2
UPDATE foo SET column = 'something'; -- Change something in one table.
COMMIT TRANSACTION; -- #2
Run Code Online (Sandbox Code Playgroud)
如果事务#2的提交成功,那么事务#1的提交可能会失败吗?如果是的话,你可以提供一个可能发生这种情况的例子吗?