Tag: 事务

使用JDBC 3.0实现对嵌套事务的支持

我们的遗留应用程序使用JDBC 3.0。 它通过实现自己的事务管理器来支持事务,该事务管理器能够为每个线程返回相同的JDBC连接。 我最近发现的问题是它不支持嵌套事务:如果事务是在另一个事务中启动的,那么在内部事务的上下文中运行的每个SQL都将使用相同的数据库连接执行,并且当它被提交或者回滚它会自动提交或回滚从外部事务开始的所有更改。 据我所知,我可以使用JDBC 3.0保存点实现对嵌套事务的支持:每当启动嵌套事务时,我都可以为当前连接设置新的保存点。 之后,如果嵌套事务被回滚,我将回滚到此保存点。 另一方面,如果它被提交,我将什么都不做。 只有最外部事务的提交才会将更改保存到db。 它是否正确? 这种方法有什么缺陷吗? 如果是的话,我的可能性是什么? 谢谢。

容器管理事务无法回滚

我正在玩交易。 我配置JPA来处理我的实体,并希望将它们保存在数据库中。 问题是,当我的程序抛出runtimeException时,CMT不会回滚。 这个“容器事物”背后的想法很难理解,而且记录很少。 @transactional托管事务,纯CDI Interceptor托管事务和Bean管理事务就像一个魅力。 这是我编码的内容:这是一个简单的“电影演示”。 你想看两部带X座位的电影。 座位有限。 如果电影中的座位不足,则不应该有交易(ACID和东西) 在我的buyTicketsBoundary类: 起初我告诉我的class级我们正在使用CMT: @Named(“buchungBoundry”) @RequestScoped @TransactionManagement(TransactionManagementType.CONTAINER) public class BuchungBoundry { @EJB private BuchungVerwaltung buyTicketsController; @EJB private KundenVerwaltung customerController; @EJB private SaalVerwaltung roomController; @EJB private MovieVerwaltung movieController; private int ticketsForMovie1; //this is how many tickets we want to buy private int ticketsForMovie2; public BuchungBoundry() { } @TransactionAttribute(TransactionAttributeType.REQUIRED) […]

Spring @Transactional并发

class MyService { public void a() { synchronized(somekey) { b(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { …do DB works… } } class MyService { public void a() { synchronized(somekey) { b(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { …do DB works… } } class MyService { public void a() { […]

如何从容器管理的事务提交中捕获exception?

我有一个带有@WebService接口的@Stateless EJB,使用容器管理的事务,这意味着如果没有抛出系统exception,在调用方法后,容器会自动提交事务。 如果我尝试EntityManager.persist(…)两个具有相同值的对象,对于具有唯一约束的列,容器将在我的代码之外的提交时向客户端抛出PersistenceException 。 我如何捕获此exception,以便我可以重新抛出自己的应用程序exception? 我是否必须在我的方法中手动提交事务以捕获提交中的exception? (并且EntityManager.flush()是正确的方法吗?)如果是这样,那么容器管理事务的重点是什么?

理解hibernate中的session.get vs session.load方法

我无法理解load和get之间的区别。 当我给session.load时,下面的代码不起作用。 它给出了空指针exception。 但是当我使用session.get()时,同样有效。 public Employee getEmployee(final String id){ HibernateCallback callback = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException,SQLException { //return (Employee)session.load(Employee.class, id); doesn’t work return (Employee)session.get(Employee.class, id); //it works } }; return (Employee)hibernateTemplate.execute(callback); } 我还想了解如何将Session对象传递给doInHibernate。 会话何时开始以及何时结束? 堆栈跟踪如下 Exception in thread “main” java.lang.NullPointerException at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372) at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121) at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87) […]

Springunit testing用例不会回滚插入记录

以下测试用例在function上正常工作,但其中一个必须在数据库中创建新文章的测试方法在测试用例执行结束时不会回滚。 我希望它能以这种方式运作。 对于测试用例,更新文章实际上在测试用例执行结束时回滚更新。 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = “/applicationContext-test.xml”) @TransactionConfiguration(transactionManager = “txManager”, defaultRollback = true) @Transactional public class PriceRepositoryTest { @Resource(name =”repository”) private PriceRepository repository; @Test public void testGetAll() throws Exception { Assert.assertEquals(8, repository.getAll().size()); } @Test @Rollback public void shouldSaveNewArticle(){ Article article = new Article(); article.setName(“Article”); article.setPrice(33); repository.save(article); Assert.assertEquals(9, repository.getAll().size()); } @Test @Rollback public void shouldUpdateArticle(){ Article […]

如何在同一个Hibernate事务中运行本机SQL查询?

我们有一个@Statefull服务。 大多数数据操作都是primefaces的,但在一组函数中我们希望在一个事务中运行多个native queries 。 我们为EntityManager注入了一个事务范围的持久化上下文。 在创建正常实体的“束”时,使用em.persist()一切正常。 但是当使用本机查询(某些表未由任何@Entity表示)时,Hibernate不会在同一事务中运行它们,但基本上每个查询使用一个事务。 所以,我已经尝试过使用手动START TRANSACTION; 和COMMIT; 条目 – 但这似乎干扰了事务,hibernate在混合本机查询和持久性调用时用于持久化实体。 @Statefull class Service{ @PersistenceContext(unitName = “service”) private EntityManager em; public void doSth(){ this.em.createNativeQuery(“blabla”).executeUpdate(); this.em.persist(SomeEntity); this.em.createNativeQuery(“blablubb”).executeUpdate(); } } 此方法中的所有内容都应在一个事务中发生。 这可能与Hibernate一起使用吗? 在调试它时,可以清楚地看到每个语句都发生在任何事务的“独立”状态。 (即每次声明后立即将更改刷新到数据库。) 我已经使用最小设置测试了下面给出的示例,以便消除问题上的任何其他因素(字符串仅用于在每次查询后检查数据库的断点): @Stateful @TransactionManagement(value=TransactionManagementType.CONTAINER) @TransactionAttribute(value=TransactionAttributeType.REQUIRED) public class TestService { @PersistenceContext(name = “test”) private EntityManager em; public void transactionalCreation(){ em.createNativeQuery(“INSERT INTO `ttest` (`name`,`state`,`constraintCol`)VALUES(‘a’,’b’,’c’)”).executeUpdate(); […]

当transactionManager未命名为“transactionManager”时

我正在尝试Spring 3(.0.2.RELEASE)和JPA2和Hibernate 3.5.1-Final …有一点让我感到不安的是,spring似乎只接受一个名为“transactionManager”的事务管理器 如果我没有将它命名为“transactionManager”,Spring将抛出NoSuchBeanDefinitionException:没有定义名为’transactionManager’的bean 。 这是我的配置: 在此配置中,实体管理器工厂不一定命名为“entityManagerFactory”,“txAdvice” 也不一定命名为“txAdvice”。 但我不知道为什么Spring上需要一个名为“transactionManager”的事务管理器? 有没有办法不将事务管理器命名为“transactionManager”? (我正在运行多个spring配置文件,所以我尽量避免名称冲突) 测试代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={“classpath:mining.xml”}) public class MiningPersonDaoTest { @Inject private EntityManagerFactory miningEntityManagerFactory; @Inject private MiningPersonDao miningPersonDao; @Transactional @Test public void testUpdate() { MiningPerson p = miningPersonDao.get(42L); p.setLocationName(“OOXX”); miningPersonDao.update(p); System.out.println(p); } }

什么是数据库会话?

我理解对数据库事务概念的一般理解。 我们访问事务中的数据库以确保ACID属性。 在Hibernate中有一个称为会话的概念。 会话的用途是什么? 数据库访问何时应该在两个会话中而不是在同一个会话中发生? 为了解释更多,我已经看到了hibernate代码 从会话工厂获取会话 打开一个会话 开始交易 提交交易 结束会议 我需要知道的是会话在这里的重要性是什么? 为什么不像事务工厂那样,开始事务和提交事务?

Grails,使用withTransaction插入大量数据会导致OutOfMemoryError

我正在使用Grails 1.1 beta2。 我需要将大量数据导入我的Grails应用程序。 如果我反复实例化一个grails域类然后保存它,那么性能会慢得令人无法接受。 例如,从电话簿导入人员: for (each person in legacy phone book) { // Construct new Grails domain class from legacy phone book person Person person = new Person(…) person.save() } 事实certificate这很痛苦。 Grails邮件列表上的某人建议在事务中批量保存。 所以现在我有: List batch = new ArrayList() for (each person in legacy phone book) { // Construct new Grails domain class from […]