- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这样的代码
@Transactional(propagation = Propagation.NESTED)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class C1 {
...
public void xxx() {
try {
obj.someMethod();
} catch (Exception e) {
C2.yyy();
}
}
}
public class C2 {
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false)
public void yyy() {
...
}
}
我的假设是,当 obj.someMethod();
抛出违反约束的异常时,C2.yyy()
应该仍然能够将内容保存到数据库中。
但是我看到的是,当 C2.yyy()
被称为 Postgres 报告时
ERROR: current transaction is aborted, commands ignored until end of transaction block
为什么要这样做?毕竟 C2.yyy()
应该在不同的事务中运行,该事务应该不受调用代码中发生的状态的影响。不?
这里是我发现的进一步调试 - 让我们假设调用堆栈是这样的
@Transactional(readOnly = false, propagation = Propagation.NESTED)
b1.m1()
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
b2.m2()
b3.m3()
b4.m4()
我的假设是,由于 b2.m2() 上的注解,m4() 中的数据库代码将在新事务中执行。但似乎TransactionAspectSupport.java中的代码只查看当前方法上的事务注解,而不查看堆栈上的事务注解。当它在 m4() 上找不到任何 @transactional 时,它假定需要。这不是不正确吗?
最佳答案
如此处 DatabaseError: current transaction is aborted, commands ignored until end of transaction block 所回答:“当查询产生错误并且您尝试运行另一个查询而不先回滚事务时,这就是 postgres 所做的”。
这意味着您的“obj”应该在其自己的事务中运行并在出现异常时回滚。
关于更新中的问题:REQUIRES_NEW 总是创建一个新事务,它既是 documented 又是经过测试的。
关于database - Spring Propagation.REQUIRES_NEW 嵌套在 Propagation.NESTED 时的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38008731/
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
在下面的代码方法doService1()中更新了正确的sql,但是doService2() sql有一些问题,但是当我调用doService()时即使 doService2() 有 sql 异常,它也
根据我的理解,以下代码中的 newPrint 方法应该创建一个新事务,但显然它打印出与 oldPrint 方法中使用的相同的事务状态对象。我正在从另一个类(class)调用 oldPrint。是因为使
根据 documentation , 在容器管理的事务中,如果一个方法被注释为 TransactionAttributeType.REQUIRES_NEW 属性,将暂停任何客户端事务,委托(deleg
我想集成测试一个调用使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 的方法的服务方法.但是,基于内部(新)事务的断言失败。 clas
我想测试一种通过在循环中调用 DAO 将数据插入表中的服务方法。服务方法被注释为 @Transactional(propagation = Propagation.REQUIRES_NEW) 单元测试
我正在使用 EJB 3.0 开发 SAP java 应用服务器 我想一个一个地插入数据库。因为我的数据太多了,要分数据。所以我尝试了测试代码,它确实有效,但没有按我想要的那样工作。 我想为每个部分创建
考虑一个需要很长时间的事务。在此期间,我想对 TableSmall 执行一些小更新。 ,它应该立即执行,并且主事务的回滚不应该回滚那些小的更新。 我当前的问题是这些小更新将锁定 TableSmall\
我遇到这样的错误 a different object with the same identifier value was already associated with the session:
在 spring 容器中,代码如下: public class A { @Transactional public void m1() { ... b.
我有方法: @Transactional public void importChargesRequest() { ... for (Charge charge : charges)
我的 spring (4.1.1) 应用程序部署在 JBoss-6.10-final 实例上,因此它使用基于容器的事务管理器和数据源。对于消息传递,我使用 TIBCO EMS 8.1 和 XA 队列连
我的服务等级。 @Service @Transactional(value = "transactionManager", readOnly = true, propagation = Propaga
我让 spring 将服务注入(inject)自身,以允许服务对其自身进行事务调用。不幸的是,我发现抛出 NullPointerException 并被捕获的 require_new 方法不会回滚新事
我需要在 glassfish3.0 上使用 JPA 2.0 和 EJB3.0 删除忽略任何完整性约束的员工列表(即成功删除尚未与任何其他实体相关的实体或跳过与其他实体相关的实体) : 我迭代列表并在
运行我的测试时,它在调用 method() 时挂起。难道我做错了什么?救命! @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration
我测试了我的 ejb jpa 事务。我使用容器管理的 entityManager: @PersistenceContext(unitName = "ParticularUnit") EntityMan
有两个函数 A 和 B 定义了事务注解。 我正在从 A 调用 B。 @Transactional(value=Constants.READ_WRITE_REQUEST) public int A(..
同时对基于 JPA 的 DAO 层进行压力测试(同时运行 500 个同时更新,每个更新都在一个单独的线程中)。我遇到了以下-系统一直卡住无法取得任何进展。 问题是,在某个时候任何线程都没有可用的连接,
我是学习 Spring Boot 的新手。我想知道 @Transactional 注释的传播属性中 REQUIRES_NEW 的实际用例是什么。 我知道,如果新事务的请求到达,它会暂停正在进行的事务,
我是一名优秀的程序员,十分优秀!