java - 如何安全地强制提交 Spring - hibernate 事务

标签 java database spring hibernate transactions

我们正在将 spring 和 hibernate 用于 Web 应用程序: 该应用程序有一个购物车,用户可以在其中放置元素。为了保存在不同登录之间查看的商品,购物车中的商品值存储在表中。当提交购物车时,商品将被保存到不同的表中,我们需要生成订单号。

当我们将值插入表中以获取订单号时,我们使用它来获取最大订单号并为其添加 +1。我们使用 spring 事务管理器和 hibernate,在代码流中我们获取订单号并更新 hibernate 对象以保存订单号值。当我调试时,我注意到只有当完整的事务发出时,才会插入订单号实体 bean。

这里的问题是,当我们同时向服务器提交两个请求时,使用相同的订单号,并且只插入一个请求数据。无法插入另一个请求值,该值又是唯一的。 表中的订单号是唯一的。

我注意到在调试时,即使在发出 session 刷新之后,持久层也没有插入到数据库中 session.flush()

它只是在 Spring 事务结束时更新内存并将数据插入数据库。我尝试显式发出事务提交

session.getTransaction().commit();

这会立即将值插入数据库,但在进一步的代码流中显示无法启动事务的消息。

非常感谢任何帮助。

添加: 我用的Oracle数据库。 该表有一个唯一的序列号,并且订单号也映射到它。

最佳答案

请按照以下步骤操作:- , 1)在不同的服务类中创建一个具有传播REQUIRES_NEW的服务方法。 2)在这个新方法中移动您的代码(无论您想要刷新到数据库中的任何代码)。 3)从现有的api调用这个方法(由于Spring中的代理,我们必须从不同的类调用这个新的服务方法,否则REQUIRES_NEW将无法工作,以确保您的刷新数据)。

关于java - 如何安全地强制提交 Spring - hibernate 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435989/

相关文章:

java - 如何使用 Hibernate 按一个属性搜索另一个属性?

java - NotSerializedException 实现 Serialized 的序列化类

java - 如何创建一个向客户端分发工作单元的服务器?

java - 在拦截方法上配置拦截器(代理)

java - Spring mvc :resource not finding *. ico 文件

java - Spring Java 日期到日期模式验证

java - 如何从 Java 调用 GraphViz

ios - 在 sqlite 数据库中插入 blob (objective-c)

.net - 通过 EF 6 DbContext 重用数据库连接是否可以节省时间?

java - 如何在 Microsoft Azure 网站上更改 jvm 参数