【发布时间】:2014-06-26 16:43:46
【问题描述】:
我们在 web 应用程序中使用 spring 和 hibernate: 该应用程序有一个购物车,用户可以在其中放置物品。为了保存不同登录之间要查看的项目,购物车中的项目值存储在表中。提交购物车时,商品将被保存到不同的表中,我们需要生成订单号。
当我们将值插入表中以获取订单号时,我们使用获取最大订单号并将其添加 +1。我们正在使用 spring 事务管理器和休眠,在代码流中我们获取订单号并更新休眠对象以保存订单号值。当我调试时,我注意到只有在发出完整的事务时才会插入订单号实体 bean。
这里的问题是当我们同时向服务器提交两个请求时,使用了相同的订单号,并且只插入了一个请求数据。无法插入另一个唯一的请求值。 表中的订单号是唯一的。
我注意到,在调试持久层时,即使在发出会话刷新之后,也没有将其插入数据库
session.flush()
它只是在 spring 事务结束时更新内存并将数据插入到 db 中。我尝试明确发布对事务的提交
session.getTransaction().commit();
这会立即将值插入数据库,但在进一步的代码流中显示无法启动事务的消息。
非常感谢任何帮助。
添加: 我使用的 Oracle 数据库。 该表有一个唯一的序列号,并且订单号也映射到它。
【问题讨论】:
-
您使用的是哪个数据库?它不支持序列吗?你所有的问题都会得到解决。
-
你的交易的传播类型是什么?
-
@MartinFrey 使用 oracle 数据库,问题是根据业务规则,订单号应以 100000 开头,并以 999999 结尾。我同意如果它是一个序列号,那不会有问题。
-
@RafikBeldi 该方法没有设置特定的传播参数,我们使用如下声明的应用程序上下文级别事务管理
-
@RafikBeldi 我正在使用默认的 Propagation_required 类型。
标签: java database spring hibernate transactions