Tag: 事务

JPA RollbackException持久化事务导致后续有效事务失败?

我有一个@Transactional服务在oracle DB中执行持久化操作。 如果我运行一个持久化程序打破一个唯一的违规,我得到预期的rollbackException:ConstraintException。 问题是任何后续请求(即使不破坏唯一约束)持久化都会引发相同的exception。 似乎JPA没有清除对象以保持其事务管理器? 我甚至关闭? 我需要一点解释。 回购: @Repository public class UserRepository { @PersistenceContext(type=PersistenceContextType.EXTENDED) private EntityManager em; public User findUserById(long id){ CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(User.class); Root root = query.from(User.class); Predicate whereClause = builder.equal(root.get(User_.userId), id); return em.createQuery(query.where(whereClause)).getSingleResult(); } public User findUserByCredentials(String credentials){ CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(User.class); Root root […]

Grails – 为什么需要交易?

首先是一些背景:我使用Spring Security的修改版本来执行Active Directory身份validation,并检查存储在数据库中的可能访问权限。 这意味着在普通的Groovy类中调用从数据库加载信息: if (Holders.config.loadRolesFromDatabase) { Set roles = DomainClassUser.findByUsername(username)?.roles if (roles) authorities.addAll(roles.collect({ new SimpleGrantedAuthority(‘ROLE_’ + it.name) })) } 这在Hibernate 4.3.6.1和Tomcat 7.0.54上运行得很好,但是,在升级它们(到4.3.10.18和8.0.14.1)后,它现在在调用动态查找器时产生“HibernateException:当前线程找不到会话”exception方法。 做了一些研究之后,我决定将这段代码包装在withTransaction块中: if (Holders.config.loadRolesFromDatabase) { DomainClassUser.withTransaction({ Set roles = DomainClassUser.findByUsername(username)?.roles if (roles) authorities.addAll(roles.collect({ new SimpleGrantedAuthority(‘ROLE_’ + it.name) })) }) } 这修复了错误,但是,我不确定为什么这是必需的。 我目前对withTransaction的理解是它用于创建可以在exception情况下回滚的事务等。但是,我不需要在这里执行任何回滚(它只是所有只读调用),为什么我仍然需要一个交易来执行此调用?

使用@Transactional时,EntityManager.persist()不会插入数据

最近我将项目设置更改为使用Spring进行声明式事务处理。 或者至少我想。 当我调用persist ,不执行任何INSERT语句。 我为Spring ORM启用了TRACE日志级别,这就是我得到的: DEBUG JpaTransactionManager: Creating new transaction with name [albw.service.TransactionTestService.doServiceMethod]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ” DEBUG JpaTransactionManager: Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@28a7bd7a] for JPA transaction DEBUG BasicResourcePool: trace com.mchange.v2.resourcepool.BasicResourcePool@10ea443f [managed: 5, unused: 4, excluded: 0] (eg com.mchange.v2.c3p0.impl.NewPooledConnection@1ca37c6a) DEBUG JpaTransactionManager: Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@55d4ee7e] TRACE TransactionSynchronizationManager: Bound value [org.springframework.jdbc.datasource.ConnectionHolder@e75be38] for key [com.mchange.v2.c3p0.ComboPooledDataSource [ […]

TransactionEventHandler在Node.setProperty()上给出javax.transaction.SystemException

我正在尝试实现一个类似于neo4j-versioning中使用的TransactionEventHandler ,以便创建一个时间机器样式,版本化的Neo4j数据库,现在使用Neo4j 2.x. 它失败并带有以下无限堆栈跟踪: javax.transaction.SystemException: TM has encountered some problem, please perform necessary action (tx recovery/restart) at org.neo4j.kernel.impl.transaction.TxManager.assertTmOk(TxManager.java:349) at org.neo4j.kernel.impl.transaction.TxManager.setRollbackOnly(TxManager.java:758) at org.neo4j.kernel.TransactionEventHandlers.beforeCompletion(TransactionEventHandlers.java:120) at org.neo4j.kernel.impl.core.TransactionEventsSyncHook.beforeCompletion(TransactionEventsSyncHook.java:68) at org.neo4j.kernel.impl.transaction.TransactionImpl.doBeforeCompletion(TransactionImpl.java:368) at org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:398) at org.neo4j.kernel.impl.core.IsolatedTransactionTokenCreator.getOrCreate(IsolatedTransactionTokenCreator.java:61) at org.neo4j.kernel.impl.core.TokenHolder.createToken(TokenHolder.java:114) at org.neo4j.kernel.impl.core.TokenHolder.getOrCreateId(TokenHolder.java:102) at org.neo4j.kernel.impl.api.store.DiskLayer.propertyKeyGetOrCreateForName(DiskLayer.java:367) at org.neo4j.kernel.impl.api.store.CacheLayer.propertyKeyGetOrCreateForName(CacheLayer.java:370) at org.neo4j.kernel.impl.api.StateHandlingStatementOperations.propertyKeyGetOrCreateForName(StateHandlingStatementOperations.java:939) at org.neo4j.kernel.impl.api.DataIntegrityValidatingStatementOperations.propertyKeyGetOrCreateForName(DataIntegrityValidatingStatementOperations.java:67) at org.neo4j.kernel.impl.api.OperationsFacade.propertyKeyGetOrCreateForName(OperationsFacade.java:397) at org.neo4j.kernel.impl.core.NodeProxy.setProperty(NodeProxy.java:205) … 这是我的测试: @Test public void test() { GraphDatabaseService graphDb […]

DataLoader使用Spring Batch – 分区

我正在研究一个读取平面文件的数据加载器,一些处理和写入数据库。 dataloader.properties文件包含该值 LOAD=MM1,MM2,MM3,MM4,MM5… 我必须阅读这个属性文件并使用spring batch的partition step和partitioner ,我想要文件夹内的所有文件(MM1),读取和写入db parallel,特定文件的任何db错误都应回滚该内容文件,类似于其他文件夹(MM2)因为我是春季批处理的新手,我想知道如何对文件夹和XML配置文件中的文件名进行后期绑定,并且需要进行适当的回滚。 我还想在文件夹分区步骤中共享数据 以下是执行此操作的粗略配置。 根据上述要求,这是一种正确的方法吗?

{Core Java with Spring}通过普通JDBC调用PL SQL存储过程 – 谁应该理想地进行事务管理

我的应用程序从Java / Spring调用Oracle存储过程。 没有Hibernate或iBatis或Spring JDBC模板。 从没有业务逻辑检查,没有validation的意义上讲,这个服务器端/中间层是“瘦的”; 它只是UI和数据库之间的数据传输层。 java代码在数据检索或数据持久性的情况下调用存储过程。 存储过程是与各种表/表关系交互并聚合数据的大家伙。 问题 – 在这种情况下,谁应该理想地管理交易? 从Java代码还是从存储过程? 通常,当中间层管理数据或执行业务逻辑,或者validation时,我们将使用普通的JDBC / ORM框架与各种表进行交互,从而管理事务。 但在我的用例中,SP正在与表进行交互,决定数据是否被正确检索或能够持久,为什么它应该依靠中间层来单独管理事务。 它可以很好地知道是提交事务还是回滚事务。 在数据检索的情况下总是编写一个为聚合函数作为高级接口的SP,或者在数据持久化的情况下编写汇总函数,并最终执行事务提交或事务回滚,这不是更好吗? 只有在预期为特定操作调用多个SP时,中间层才需要处理事务管理。 只要java代码只为特定操作[fetch / update / delete]调用一个SINGLE存储过程,管理存储过程本身的事务提交和回滚是不是很好? 如果SP内部出现问题,它可以回滚事务并引发exception,然后Java会将该exception消息[或记录并将自定义exception传递]传递给UI。 反问题是让SP在遇到任何exception的情况下引发exception,并且Java代码反过来捕获exception并执行事务回滚。 如果在调用SP时没有exception,则让它进行事务提交。 但是在这里,SP已经知道事务是成功还是失败,那么为什么我们不能自己进行提交或回滚,而是以exception或无exception的forms传递该信息并让java代码执行提交/回滚? 更新:certificate需要Java代码来管理事务的一件事是它调用MULTIPLE SP进行SINGLE操作。 但是,同样的结果可以通过一个高级例程来实现,该例程执行内部调用各个例程的逻辑,最后做出提交/回滚的决定。 请分享您对此的想法/建议/设计建议。 PS:我这里没有共享任何代码,但这是一个程序设计问题,关于谁应该管理交易?

用于事务重用的Hibernate模式

我有一个基本方法,我写的是为了不反复重复相同的hibernate会话/事务逻辑。 这很简单,但有一个特定的问题,我不确定这种方法可以解决。 想象一下,您有一个User实体和一个Permission实体。 如果请求保存用户及其匹配权限,那么我认为在单个事务中执行这两个操作是有意义的,因为只能保存其中一个实体可能被视为数据损坏。 例如,如果未能保存用户的权限,则可以保证对先前插入的用户数据进行回滚。 我提出了以下方法来允许通用的hibernate操作,如果有必要可以使用当前事务,尽管我现在认为,在调用session.beginTransaction()时它的当前forms不会起作用。 即使前一个没有被提交,也可能会返回一个新的事务(这是这种情况吗?)。 假设我更改了它以使其返回当前会话和事务,如果指定当前事务将有更多操作,您认为它会起作用吗? 做这样的事情是否可取,或者你会建议改变方法吗? 谢谢 protected void baseOperation(Class entityClass, List instances, BaseHibernateDAO.Operations operation, boolean isLastOperation) throws Exception { Session session = null; Transaction transaction = null; boolean caughtException = false; //get session from factory session = HibernateSessionFactory.getSession(); try { //get current transaction transaction = session.beginTransaction(); for (Object instance : instances) […]

当JMS Prod位于帮助程序POJO类中时,如何在事务中包含JMS生产者

简短的问题:是否有办法强制由无状态EJB调用的POJO存在于EJB的上下文中,以便事务和资源注入在POJO中起作用? 特别是在我想要做的事情的上下文中:如何在EJB的事务中包含POJO JMS Producer,它在调用POJO发送消息之前将数据库中的某些数据持久化,这样如果消息不能由于exception发送,数据库事务也会回滚吗? 我想异步发送邮件。 这是快乐的路径(从无状态会话bean开始): 将数据保存到数据库//这有效 从持久数据中提取数据并将其放入自定义“消息”类(实际上是dto) 调用EmailQueueMessenger POJO的sendEmail方法,将消息对象传递给它。 消息被发送到MDB以处理和发送电子邮件(不是问题的一部分,只是为了完整性) 下面的代码工作,它只是不会在调用类中回滚数据库“persist”如果我强制说错误,例如,上下文查找。 顺便说一句,我也无法让@Resource注入工作。 //In the EJB EmailQueueMessenger eqm = new EmailQueueMessenger(); eqm.sendEmail(messageObject); // mailObject will be translated into an email message at the other end of the queue. /******************** POJO Below ************/ public class EmailQueueMessenger implements Serializable { // Resource injection doesn’t work… using ‘lookup’ […]

无需交易即可获取数据

下面是带有spring事务的示例代码片段。 我的问题: – 是否会使用相同的会话来获取第1行和第2行的实体? 我的理解: – 我相信是的,春季交易将确保这一点 @Transactional() public void method1( //fetch entity1 from dao with the help of entity manager//line 1 // fetch entity2 from dao with the help of entity manager//line 2 // now I fetch thru method entity.fetchLazyField()// line 3 ) 现在,如果我删除@Transactional() 。 我相信一旦获取entity1就会关闭会话,并且将为line2使用单独的会话。 对 ? 在第3行(一旦@Transactional被删除),我是否能够获取数据或会话被关闭应该抛出exception? 我没有粘贴大的xml配置和完整的dao代码,只是用实体管理器获取etity。 事务传播属性是Required

使用jdbc / hibernate获取当前数据库事务ID?

我已经浏览了Google,但找不到任何相关内容。 基本上,我希望掌握长期运行的交易。 现在,我将浏览information_schema.INNODB_TRX或查看show engine innodb status的输出以查找trx_id ,然后打开general_logs以查看所有查询的运行情况。 有没有办法,我可以使用jdbc或hibernate在我的代码中获取此transaction_id ,以便我可以在我的服务器日志中记录它?