spring mvc和Hibernate中的事务

spring mvc和Hibernate中的事务,hibernate,spring-mvc,Hibernate,Spring Mvc,我正在使用SpringMVC3.0和hibernate。我在这里的情况,我有库存,用户可以添加和删除项目。例如,总数量=50。现在,两个用户同时希望更新库存,比如a删除了2个项目,B删除了4个项目。因此,总数量=44。现在,当两个用户同时尝试更新库存时,我该如何处理此事务??如果没有维护事务,那么它将是50-2=48,然后是50-4=46。使用a来确保正确的语义。这是《Hibernate参考指南》整个章节的主题:您可以在版本控制中使用乐观锁定。 一旦您添加了 或永久类映射的属性。 XML中的属性

我正在使用SpringMVC3.0和hibernate。我在这里的情况,我有库存,用户可以添加和删除项目。例如,总数量=50。现在,两个用户同时希望更新库存,比如a删除了2个项目,B删除了4个项目。因此,总数量=44。现在,当两个用户同时尝试更新库存时,我该如何处理此事务??如果没有维护事务,那么它将是50-2=48,然后是50-4=46。

使用a来确保正确的语义。这是《Hibernate参考指南》整个章节的主题:

您可以在版本控制中使用乐观锁定。 一旦您添加了 或永久类映射的属性。 XML中的属性映射必须紧跟在标识符属性映射之后:

<class name="Item" table="ITEM">
    <id .../>
    <version name="version" access="field" column="OBJ_VERSION"/>
     ...
</class>
如果另一个并发工作单元更新并提交了同一行,则 OBJ_VERSION列不再包含值1,并且该行不会更新。 Hibernate检查JDBC返回的该语句的行数 驱动程序,在本例中是更新的行数,为零并抛出 StaleObjectStateException

如果没有版本或时间戳列,Hibernate仍然可以执行自动更新 版本控制,但仅适用于在同一环境中检索和修改的对象 持久性上下文(即同一会话)。 这个版本控制的替代实现检查当前数据库 对象创建时针对持久属性的未修改值的状态 已检索(或上次刷新持久性上下文时)。你可以 通过在类上设置乐观锁属性来启用此功能 映射:


...
现在执行以下SQL以刷新对项实例的修改: 更新项目集项目\u PRICE='12.99' 其中,ITEM_ID=123 和项目_价格='9.99' 和ITEM_DESCRIPTION=“一项” 而且。。。 卖方ID=45

在这两种情况下,都由您在获得StaleObjectStateException时重新启动第二个事务或合并更新。这种情况应该非常罕见,否则,您需要重构以减少事务范围,从而使其更小更快

有关更多详细信息,请参阅CHRISTIAN BAUER和GAVIN KING的《Java持久化与Hibernate》一书。(推荐)


编辑:Ryan是对的。我更正了我的答案。

这也不正确。Hibernate默认为乐观锁定,因此它不会“正常工作”。@Ryan Stewart乐观锁定是什么意思??你能解释一下吗?我搜索了乐观锁,发现:乐观的方法总是假设一切都会好起来,冲突的数据修改很少。乐观并发控制仅在写入数据时,在工作单元结束时才会引发错误。多用户应用程序通常默认为具有读提交隔离级别的乐观并发控制和数据库连接。只有在适当的情况下才能获得额外的隔离保证;例如,当需要可重复读取时。这种方法保证了最佳的性能和可扩展性。
update ITEM set INITIAL_PRICE='12.99', OBJ_VERSION=2
where ITEM_ID=123 and OBJ_VERSION=1
<class name="Item" table="ITEM" optimistic-lock="all">
<id .../>
...
</class>