我们正在将 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/