标签: nested-transactions

实现NHibernate嵌套事务行为

我正在尝试使用NHibernate的事务控制和FlushMode选项来实现某种嵌套事务行为,但是在阅读太多之后事情变得有点混乱,所以我在下面列出的事实的任何确认都将非常有用.

我想要的是打开一个在小事务中分裂的大事务.想象一下以下场景:

  • TX1打开一个TX并插入一个Person的记录;
  • TX2打开TX并将此人的姓名更新为P2;
  • TX2提交;
  • TX3打开TX并将此人的姓名更新为P3;
  • TX3回滚;
  • TX1提交;

我想看看NH将INSERT和TX2 UPDATE发送到数据库,只是忽略了回滚的TX3.

我尝试使用FlushMode = Never并且只在需要正确的Begins/Commits/Rollbacks之后才刷新会话,但NH总是使用对象的最终状态更新数据库,与提交和回滚无关.这是正常的吗?使用FlushMode = Never时NH是否真的忽略了事务控制?

我还尝试使用FlushMode = Commit并打开嵌套事务,但我发现,因为ADO.NET,嵌套事务实际上总是相同的事务.

请注意,我并不是想要实现"全有或全无"的行为.我正在寻找一种保存点的工作方式.NH有没有办法(保存点)?

先感谢您.

菲利佩

nhibernate transactions nested-transactions savepoints

4
推荐指数
1
解决办法
3596
查看次数

具有嵌套事务的SQL Try/Catch逻辑

下面的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

3
推荐指数
1
解决办法
4056
查看次数

Neo4j中的嵌套事务

为了记录,我使用的是Neo4j 2.0.0-M02.

我目前有一种方法可以在其用户ID上搜索标签为"User"的节点,该用户ID作为节点属性"id"存储在图中.这一切都发生在事务中,因为它会自动关闭ResourceIterator.

现在,我想在两个用户之间创建一个关系.我只拥有他们的用户ID.现在,我显然希望重用按其ID搜索用户的方法.我有三种方法可以想到.

第一个是显而易见的.使用现有方法检索两个节点.比调用创建它们之间关系的方法.显然这也发生在一个事务中,所以这需要三个事务.效率不高.

第二个是在创建关系的新方法中重用代码(而不是方法).这样,我可以在一个事务中完成所有操作,但我复制的代码对于开发人员来说并不是一个很好的实践.

第三个是在创建关系的新方法的事务内调用现有方法两次.这样我的代码仍然可以重用,但我不确定嵌套事务在Neo4J中是如何工作的.是否会忽略现有方法的交易,因为已有现有交易?这将解决我的问题.

如果没有,我必须重新考虑我管理交易的地方.我知道在服务中管理它们通常比在DAO中更好,但我想将Neo4j的东西从我的服务类中保留下来.

transactions nested-transactions neo4j

1
推荐指数
1
解决办法
1444
查看次数

如果成功提交嵌套事务,则父事务是否可能失败

我正在尝试理解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的提交可能会失败吗?如果是的话,你可以提供一个可能发生这种情况的例子吗?

sql t-sql sql-server transactions nested-transactions

1
推荐指数
1
解决办法
81
查看次数