当前位置: 首页 > 知识库问答 >
问题:

插入失败后,我可以继续处理数据库事务吗?

刁越
2023-03-14

我们的应用程序是高度并发的。它正在获取MQ数据并将其保存到数据库中。有多条消息可能包含相同的数据。因此一条消息可能包含工作时间,第二条消息可能包含工作时间和位置。

所以第一条消息通过了,我保存了工作时间数据。然后,第二个事务将获得与工作时间相同的精确数据。现在我需要保存位置数据,但工作时间是重复的。由于并发性的原因,我无法检查数据库的操作时间(如果我检查,它可能不存在,那么在保存它时,它可能已被另一个线程插入)。我还想快点。(此装载机上有大量负载。)

目前,一条消息只获得一个事务(传播。必需)(使用Spring和Hibernate)。每次插入数据后,我都会刷新一次。所以我保存了位置数据,做了一次冲洗。然后我节省工作时间和冲洗。

如果我只是捕捉错误消息(它是在flush()之后抛出的)并吃掉它,那么其他保存的数据(位置数据)还会被保存吗?数据库插入失败后,该事务仍然可以使用吗?因此,如果第一次保存失败,我希望第二次插入能够成功。

我一直在看Propagation.REQUIRES_NEW,但遇到了一些麻烦。另外,我担心放慢速度。我需要3个事务(在这一切之前有一点逻辑。

we上的大多数信息都谈到了回滚,但我不想回滚。我只想向前看。我可以吗?

共有1个答案

宰父玄天
2023-03-14

不,您无法捕获异常并尝试继续。下面是关于hibernate文档异常处理的章节所说的:

如果会话抛出异常,包括任何SQLException,立即回滚数据库事务,调用Session.close()并放弃会话实例。某些会话方法不会使会话处于一致状态。Hibernate抛出的任何异常都不能被视为可恢复的。

 类似资料:
  • 1、Db.tx 事务 在 Db 工具类里面,提供了一个系列的 tx(...) 方法支持数据库事务,以下是 Java 8 的 lambda 语法使用示例: Db.tx(() -> { Db.update("update t1 set f1 = ?", 123); Db.update("update t2 set f2 = ?", 456); return true; }); 以上代码中的

  • 这里我有一个函数,它应该返回秒数作为变量sec,但是return语句在数据库事务之前运行,所以我一直没有定义。我可以做些什么来确保事务在回电话之前完成。类似于用于。

  • 事务的概念 事务的概念来自于两个独立的需求:并发数据库访问,系统错误恢复。 一个事务是可以被看作一个单元的一系列SQL语句的集合。 事务的特性(ACID) A, atomacity 原子性 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处

  • 我的Firebase实时数据库的一个子节点变得巨大(大约20 GB),我需要清除这个节点,并使用Python Admin SDK将上个月从备份中提取的数据插入Firebase实时数据库。 在文档中,我看到了以下选项: set-将数据写入或替换到定义的路径,如消息/用户/ 更新-更新定义路径的某些键,而不替换所有数据 推-添加到数据库中的数据列表。每次将新节点推送到列表上,数据库都会生成一个唯一的键

  • 问题内容: PHP中是否可以关闭连接(本质上告诉浏览器没有更多数据可用)但是可以继续处理。我正在考虑的特定情况是,我想提供缓存的数据,然后,如果缓存已过期,我仍然会提供缓存的数据以快速响应,关闭连接,但继续进行处理以重新生成并缓存新的数据数据。本质上,唯一的目的是使网站显得更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟。 更新: PLuS对我一直在寻找最接近的答案。为了澄清几个人,我正在

  • 问题: 怎样使用数据库事务处理? 解决: 数据库对象有一个方法“transaction”,将启动一个新的事务,并返回事务对象。这个事务对象可以使用commit提交事务或rollback来回滚事务。 import web db = web.database(dbn="postgres", db="webpy", user="foo", pw="") t = db.transaction() try