标签: nested-transactions

82
推荐指数
2
解决办法
4万
查看次数

EJB 3.0 - 嵌套事务!=需要新的吗?

我刚刚阅读了"掌握EJB 3.0"的事务章节(10),现在我对嵌套事务感到困惑.

这本书说

"EJB定义的事务管理器不支持嵌套事务;它只需要支持平面事务." (网站278,注)

这个事实不仅在本书中有所描述,我在其他书籍/网站上发现了这一说法.

但是,如果我从a调用一个"Requires New"注释方法,让我们说"必需"注释Methode,我所拥有的是一个嵌套事务,不是吗?我可以回滚内部事务或提交它,而不会影响外部事务.如果我想要中止外部事务,我会抛出一个EJBException,整个事务将被回滚.

那么,只是EJB 3.0规范不要求这种行为,或者我误解了什么?我无法区分嵌套事务和描述的行为.

关心诺曼

transactions nested-transactions java-ee ejb-3.0

25
推荐指数
2
解决办法
2万
查看次数

SAVE TRANSACTION vs BEGIN TRANSACTION(SQL Server)如何很好地嵌套事务

我有一个存储过程需要设置一个保存点,以便在某些情况下,它可以撤消它所做的一切,并将错误代码返回给调用者,或接受/提交它并将成功返回给调用者.但无论调用者是否已经开始交易,我都需要它.该文件在这个问题上非常混乱.这是我认为可行的,但我不确定所有的后果.

问题是 - 这Stored Procedure (SP)是其他人所称的.所以我不知道他们是否已经开始交易......即使我要求用户开始使用我的SP交易,我仍然对正确使用Save Points...的问题有疑问

我的SP将测试交易是否正在进行,如果没有,请启动一个BEGIN TRANSACTION.如果一个事务正在进行中,它将改为创建一个保存点SAVE TRANSACTION MySavePointName,并保存这就是我所做的事实.

然后,如果我必须回滚我的更改,如果我BEGIN TRANSACTION早点做了,那么我会ROLLBACK TRANSACTION.如果我做了保存点,那么我会ROLLBACK TRANSACTION MySavePointName.这种情况似乎很有效.

这是我有点困惑的地方 - 如果我想保留我已经完成的工作,如果我开始一个事务,我将执行COMMIT TRANSACTION.但是如果我创建了保存点?我试过COMMIT TRANSACTION MySavePointName,但然后调用者尝试提交其事务并收到错误:

COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION.

所以我当时想知道 - 可以回滚一个保存点(这样可行:ROLLBACK TRANSACTION MySavePointName不会回滚调用者的事务).但也许人们永远不需要"承诺"它?它只是停留在那里,以防你需要回滚它,但一旦原始事务提交(或回滚)就会消失?

如果有一种"更好"的方式来"嵌套"交易,请也提供一些建议.我还没有弄清楚如何嵌套BEGIN TRANSACTION但只是回滚或提交我的内部事务.似乎ROLLBACK总会回滚到顶层事务,而COMMIT只是递减@@trancount.

sql-server transactions nested-transactions

15
推荐指数
3
解决办法
3万
查看次数

嵌套事务的目的

我从未理解嵌套事务的好处.提交嵌套事务不会提交任何内容 - 它只会减少@@TRANCOUNT.并ROLLBACK回滚一切.

BEGIN TRANSACTION
   //do an update
   BEGIN TRANSACTION
     //do an insert
   COMMIT TRANSACTION
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

与此有什么不同:

BEGIN TRANSACTION
     //do an update
     //do an insert
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

请举例说明为什么要使用嵌套事务以及它们如何产生影响.

问候,Petar

database sql-server transactions nested-transactions

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

SQL Server 2005:为什么要命名事务?

我一直在整理SQL服务器中的整个嵌套事务,我已经了解了嵌套trans'行为的理解:

  • 嵌套事务时,只有最外面的提交才会实际提​​交.
  • 嵌套时,"Commit Trans txn_name"将始终应用于最内层事务,即使txn_name引用外部事务也是如此.
  • 即使在内部事务中,"ROLLBACK TRAN"(无名称)也将回滚所有事务.
  • "ROLLBACK TRAN txn_name" - txn_name必须引用最外面的txn名称.如果没有,它将失败.

鉴于这些,命名交易有什么好处吗?您无法使用它来定位特定的tranasction,无论是提交还是回滚.它仅用于代码评论目的吗?

谢谢,

约尼

sql-server transactions nested-transactions

11
推荐指数
2
解决办法
1万
查看次数

为什么JTA不支持嵌套事务

为什么JTA不支持嵌套事务?是因为实施它们的复杂性(我怀疑)还是一些设计原则?

java transactions jta nested-transactions java-ee

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

如何使用ADO.NET和SQL Server启用嵌套事务?

我有类似的问题,如何检查,如果你是在一个事务中.而不是检查,我如何允许嵌套事务?

我正在使用Microsoft SQL Server数据库与ADO.NET.我已经看到了使用T-SQL的示例以及使用begin和使用事务名​​称启动事务的示例.当调用connection.BeginTransaction时,我在同一个连接中调用另一个函数,并再次调用BeginTransaction,这给了我异常:

SqlConnection does not support parallel transactions.
Run Code Online (Sandbox Code Playgroud)

似乎许多Microsoft变种允许这样做,但我无法弄清楚如何使用我的.mdf文件.

如何使用C#和ADO.NET允许嵌套事务与Microsoft SQL Server数据库?

c# sql-server ado.net nested-transactions

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

Spring嵌套事务​​处理异常后回滚

我有一个@Service类,其中有一个@Transactional方法可以调用@Transactional另一个服务上的另一个方法。像这样的东西:

@Service
public class AService {
  @Autowired
  BService b;
  @Autowired
  ARepository aRepo;

  @Transactional
  public void methodOne(){
    try{
      b.methodTwo();
    }catch(RuntimeException e){}
    aRepo.save(new A());
  }

} 

@Service
public class BService{

    @Transactional
    public void methodTwo(){
      if(true)
        throw new RuntimeException();
    }

}
Run Code Online (Sandbox Code Playgroud)

我期望 A 实体将被插入,但如果任何嵌套事务抛出异常,插入将拒绝,即使此异常已在 处处理AService.methodOne()

我可以methodTwo()用进行注释@Transactional(propagation = Propagation.REQUIRES_NEW)。但它会击败性能。

java spring transactions nested-transactions

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

在Web服务中实际使用MySQL保存点?

有没有人有经验可以使用MySQL 保存点(直接或通过ORM)共享,特别是在非平凡的Web服务中?你在哪里实际使用过它们?它们是否足够可靠(假设您愿意运行相当新版本的MySQL)或过于尖端或昂贵?

最后,是否有人有类似以下用例的经验并且您是否使用了保存点?假设某个特定工作单元的要点是在一个Orders表中添加一行(或者其他什么,当然不必与订单相关)并OrdersAuditInfo在同一事务中更新表.必要时Orders尽可能更新,但OrdersAuditInfo表不是必需的(例如,只需将错误记录到文件中,但继续整个事务处理).在低级别它可能看起来像这样(警告,伪SQL跟随):

BEGIN;

INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
 ROLLBACK and report an error (i.e., Order is invalid in this
 case anyway). */

SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;

/* Always want to commit the INSERT INTO Orders: …
Run Code Online (Sandbox Code Playgroud)

mysql database web-services transactions nested-transactions

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

检查现有的transactioncope是否处于活动状态

我在用:

public class TransactionUtils
{
    public static TransactionScope CreateTransactionScope()
    {
        var TransactionOptions = new TransactionOptions();
        TransactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
        TransactionOptions.Timeout = TimeSpan.MaxValue;
        return new TransactionScope(TransactionScopeOption.Required, TransactionOptions);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建我的所有交易.我遇到的问题是当我窝2时TransactionUtils.CreateTransactionScope()我得到一个错误:Time-out interval must be less than 2^32-2. Parameter name: dueTm.我假设这是因为它试图将子事务附加到父事务,并且组合的超时很大.

有没有办法判断新创建的事务是否是嵌套事务,这样我可以避免设置超时?

另一种方法是传递一个参数,CreateTransactionScope()所以我可以告诉它它是嵌套的而不是设置超时但我宁愿找到一种自动处理它的方法.

c# transactions transactionscope nested-transactions

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