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

在HiberNate中属性值减少1

赵高雅
2023-03-14

我的MySQL中有一个InnoDB表,它存储产品的当前库存,每当产品售出时(总是按单位,即总是-1),库存就必须更新,比如说:

UPDATE product_stock SET current_stock = current_stock -1 WHERE product_id = ?;

现在,我正在使用Hibernate,因此我通过将currentStock属性的值设置为“currentValue -1”来更新对象ProductStock,如下所示:

instance.setCurrentStock(instance.getCurrentStock()-1);
...
session.saveOrUpdate(instance);

现在,我正在使用事务来提交更改,但是我不确定当同时进行多次销售时Hibernate会做什么,并且我无法成功复制我认为会发生的问题,也就是说,current_stock不会保存为 -1 current_stock而是保存为我设置为对象的实例属性的值。例如,我有 100 个,两个交易同时开始销售产品,并且都在代码中完成

instance.setCurrentStock(instance.getCurrentStock()-1); 

将两只股票都设置为99,那么交易结束,当前股票保存到99,而它应该是98,对吗?

问题:我是否应该/必须进行 HQL 语句以将股票直接更新为 -1,而不是从代码更新对象的值?

更新:

我能够通过在许多用户同时进行购买的情况下对应用程序进行负载测试来复制错误,但实际发生的并不是Hibernate错误地保存了库存,而是数据库级的死锁。我们目前正在研究,给出的答案非常有用。

我现在面临的问题是处理锁可能很棘手,因为current_stock表,特别是其中的某些行可能同时具有许多读取和写入。我会发布进度,希望是最终的解决方案

共有2个答案

邵耀
2023-03-14

您必须尝试Hibernate的乐观锁定属性。

 <class name="pojofile" table="tablename" optimistic-lock="">      


</class>

你也可以看到这个链接

默认情况下Hibernate中的乐观锁定

尉迟宪
2023-03-14

我认为你的选择是:

  1. 按照您的建议,直接在数据库中使用HQL递减库存水平。这样做的缺点是,如果有多个同时事务,无法保证库存水平不会低于零!
  2. 使用HiberNate的乐观或悲观锁定-这里有很多关于这个的留档信息。
  3. 确保数据库更新只能从单个线程进行,因此事务不能重叠。
 类似资料:
  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 26.6. 使用属性来减少MVC web层配置 Spring元数据从1.0开始的另一个主要用处就是提供简化Spring MVC web层配置的方案。 Spring MVC提供了处理类映射的灵活性:将输入的请求映射到控制器(或者其它处理类)的实例上。 通常处理类映射是在相关的SpringDispatcherServlet的xxxx-servlet.xml 文件中配置的。 将这些映射保存在Dispat

  • 本文向大家介绍在C++中减少菜肴,包括了在C++中减少菜肴的使用技巧和注意事项,需要的朋友参考一下 假设有个厨师。并且他收集了有关他的n道菜的满意度的数据。厨师可以在1个单位时间内烹饪任何菜肴。菜的喜欢时间系数实际上是花费的时间 烹饪该菜肴(包括以前的菜肴)乘以其满意程度,即时间[i] *满意度[i]。 我们必须找到厨师在准备菜后可以获得的最大喜欢时间系数总和。可以以任何顺序准备菜肴,厨师可以丢弃

  • 我使用的是Json。net将对象序列化到数据库。 我向类中添加了一个新属性(该属性在数据库的json中缺失),我希望新属性在json中缺失时具有默认值。 我尝试了DefaultValue属性,但它不起作用。我正在使用私有setter和构造函数来反序列化json,因此在构造函数中设置属性的值将不起作用,因为有一个带有该值的参数。 以下是一个例子: 我预计年龄是5岁,但现在是零岁。 有什么建议吗?

  • Hibernate的property元素具有update、insert属性,根据文档,它声明-http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-声明属性 update,insert(可选-默认为true):指定映射列应包含在SQL update和/或insert语句中。将两者都设置为f

  • 问题内容: 在JSF中减小viewstate隐藏字段大小的最佳方法是什么?我已经注意到,我的视图状态大约为40k,这会下降到客户端,并在每次请求和响应(尤其是到达服务器)时都返回到服务器,这对于用户来说是一个严重的问题。 我的环境JSF 1.2,MyFaces,Tomcat,战斧,RichFaces 问题答案: 您是否尝试过将状态保存设置为服务器?这应该仅将ID发送给客户端,并在服务器上保持完整状