Tag: 事务

使用DAO进行事务管理

在我的Java应用程序的DAO层中,我有两个DAO类EmployeeDAO和BankDAO 。 我需要控制/处理他们的数据库事务。 我使用连接池来获取数据库连接。 EmployeeDAO类: public class EmployeeDAO { String name; String empCode; int age; // Getters & Setters } BankDAO课程: public class BankDAO { String bankName; String acNo; String empCode; // Getters & Setters } 假设我将在两个数据库表中存储与该员工相关的员工和银行帐户详细信息。 首先我保存员工,然后保存银行详细信息, 如果在存储银行详细信息时发生错误,我需要回滚完成交易。 如何在使用DAO时管理此类事务?

事务TimeOut EJB对线程的影响

关于EJB的问题: 假设我有一个具有无限循环的会话bean。 它在EJB事务下运行。 现在当EJB的事务超时时,会导致无限循环线程中断或容器将停止运行无限循环的线程。

没有可用于当前线程的实际事务的EntityManager – 无法可靠地处理“刷新”调用

一些背景信息:我正在尝试将一个大项目从Hibernate 3.6.8迁移到5.2.5(包括JPA升级2.0到2.1),Spring 3.2.3到4.3.5并且面临严重问题。 到目前为止,Spring和Hibernate的配置还没有改变,并且在旧版本上运行良好,但是我自己无法解决升级问题。 我得到的例外是: 2017-01-16 10:15:25,635 ERROR [[ACTIVE] ExecuteThread: ’15’ for queue: ‘weblogic.kernel.Default (self-tuning)’] org.myproject.common.messaging.BaseMDB: Code: (11702) Source: (Common) Exception caught – Exception org.springframework.dao.InvalidDataAccessApiUsageException in org.myproject.core.processing.message.MessageReceiverImpl caught org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread – cannot reliably process ‘flush’ call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for […]

Spring Transaction中是否需要exception处理?

我对使用Transaction进行exception处理有疑问。 为了清楚说明我的问题,我想展示我的配置: 活动事务类是: @Transactional public class CustomerService extends BaseService implements ICustomerService { @Transactional(readOnly = true) public Customer getCustomerById(String id) { return getDaoProvider().getCustomerDao().getCustomerById(id); } @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class }) public void addNewCustomer(CustomerDTO customerDTO) { Customer customer = new Customer(); customer.setCustomerId(customerDTO.getCustomerId()); customer.setCustomerName(customerDTO.getCustomerName()); customer.setActive(customerDTO.isActive()); getDaoProvider().getCustomerDao().save(customer); } } 我的疑惑在于addNewCustomer方法。 我已经设置了rollbackFor = { Throwable.class […]

交易需要例外JPA / Spring

我在存储库类中有一个标记为@Transactional ,正在堆栈跟踪中看到正在执行的方面,但抛出的exception是“Transaction required exception” 我将@Repository注释更改为@Component (似乎它在某些情况下解决了这个问题),但它仍然在Web角色上发生。 这是堆栈跟踪: 2015-04-13 08:00:56,497 [http-nio-8080-exec-9] WARN es.mycompany.util.filters.MyFilter – Error storing : /admin/online/update org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:410) at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect$1$18a1ac9(JpaExceptionTranslatorAspect.aj:37) at es.mycopmany.dao.MyDAO.updateLastUpdatedTs_aroundBody2(MyDAO.java:36) at es.mycopmany.dao.MyDAO$AjcClosure3.run(MyDAO.java:1) at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:66) at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:72) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:70) at es.mycompany.dao.MyDAO.updateLastUpdatedTs(MyDAO.java:31) 以下是抛出exception的代码: @Transactional public void updateLastUpdatedTs(String id, Calendar […]

无法检索PlatformTransactionManager以进行测试上下文的@Transactional测试

当尝试在事务之间测试Hibernate(版本4)EHCache的缓存function时 – 它失败: Failed to retrieve PlatformTransactionManager for @Transactional test for test context 。 测试 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { ApplicationConfig.class, CachingConfig.class }, loader = AnnotationConfigContextLoader.class) @PersistenceContext @Transactional public class EHCacheTest extends AbstractTransactionalJUnit4SpringContextTests { @Autowired private SessionFactory sessionFactory; @Test public void testTransactionCaching(){ Session session = sessionFactory.getCurrentSession(); System.out.println(session.get(CustomerEntity.class, 1)); Query query = session.createQuery(“from CustomerEntity where CustomerEntity.customerId<10").setCacheable(true).setCacheRegion("customer"); @SuppressWarnings("unchecked") […]

Apache事务:事务性写入文件 – 如何使用resourceId

如果有人实施了交易写入文件,请帮助我。 相关主题在早期的线程( 事务写入 )中讨论过。 用例如下: 如果写入日志文件失败,则应回滚适当的数据库事务。 因此,文件的写入应该以事务方式执行。 我选择了Apache Commons Transaction lib。 并且有问题,这不让我走得更远,因为没有找到适当的文档或示例。 我创建了FileResourceManager的实例: FileResourceManager frm = new FileResourceManager(“c:\ cur”,“c:\ cur”,true,logger); 据我从这个Apache Commons Transaction教程中了解,我应该实现以下步骤: 开始交易: frm.start(); 获取它的事务ID: transactionId = frm.generatedUniqueTxId(); call方法,这是必需的,例如带有transactionId和resourceId的writeResource: frm.writeResource(transactionId, resourceId); 这里含糊不清: a)如何将resourceId与真实资源连接起来,我应该以transactioanally方式编写? b)我的文件,我将以事务方式编写的文件现在如何处理resourceId ? 谢谢你的建议。

H2是否支持可序列化的隔离级别?

维基百科将Phantom读取现象描述为: 当在事务过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询不同时,会发生幻像读取。 它还指出,对于可序列化的隔离级别,Phantom读取是不可能的。 我试图确保它在H2中是这样,但要么我想错了,要么我做错了什么,或者H2出了什么问题。 不过,这是代码: try(Connection connection1 = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { connection1.setAutoCommit(false); try(Connection connection2 = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { connection2.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); connection2.setAutoCommit(false); assertEquals(0, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select insertOne(connection1); // B: insert assertEquals(1, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select connection1.commit(); // B: commit for insert assertEquals(1, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select ??? } […]

如何防止“本地事务已经有1个非XA资源”exception?

我在无状态EJB中使用2 PU,并且在一个方法上调用它们: @PersistenceContext(unitName=”PU”) private EntityManager em; @PersistenceContext(unitName=”PU2″) private EntityManager em2; @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW ) public void getCandidates(final Integer eventId) throws ControllerException { ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId); … Person person = getPerson(candidate.getLogin()); … } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW ) private Person getPerson(String login) throws ControllerException { Person person = em2.find(Person.class, login); return person; } 这些方法使用REQUIRES_NEW transcaction进行注释以避免此exception。 当我从javaFX applet调用这些方法时,所有方法都按预期工作。 现在我试图从JAX-RS webservice调用它们(我没有看到任何逻辑上的区别,因为在初始上下文中查找了ejb两种情况)并且我一直得到这个exception。 […]

在非调试模式下,Spring @transaction在junit中没有按预期工作

所有MyService方法都是事务性的。 下面的junit测试,获取项目数,保存新项目,并获取项目数,以确保计数增加1。 public class MyTest extends ServiceTest{ 1. int countBefore = myService.getCount(); //return n 2. myService.add(item); //item is really added to DB 3. int countAfter = myService.getCount(); //return n (sometimes n+1) } @Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED) getCount(){…} @Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE) add(){…} @Ignore @ContextConfiguration(locations = { “file:src/main/resources/xxx-context.xml”, “file:src/main/resources/xxx-data.xml”, “file:src/main/resources/xxx-services.xml” }) @TransactionConfiguration(transactionManager = “txManager”, defaultRollback = false) @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, […]