休眠乐观锁定..它是如何工作的?

Posted

技术标签:

【中文标题】休眠乐观锁定..它是如何工作的?【英文标题】:Hibernate optimistic locking..how it works? 【发布时间】:2011-03-21 19:48:12 【问题描述】:

我正在阅读以下有关休眠乐观锁定的博客。我打算将它与休眠一起使用。但是,我有一个担心。我们有 java 代码和 c++ 代码,都连接到一个数据库。虽然,java 代码可以使用 hibernate 来实现乐观锁定,但我想让 c++ 代码做同样的事情。此外,c++ 代码使用了一些遗留代码。

http://turgaykivrak.wordpress.com/2009/05/16/72/

是否有说明 hibernate 如何实现乐观锁定的文档?

欢迎提出任何建议。

谢谢 巴拉

【问题讨论】:

【参考方案1】:

准确地说,您指的不是乐观锁,而是乐观并发(没有锁)。 为版本使用时间戳只是为了支持遗留数据库,因为现代数据库可以(至少在理论上)比存储时间戳的准确性更快。

使用整数版本属性很简单:

插入时:将版本设置为 1 更新和删除时:将版本增加 1 并将“where version=@version”附加到每个 sql 语句。返回更改的记录数。当更改的记录数与预期不同时,抛出 StaleObjectStateException。

就个人而言,我不会在非传统情况下创建两个单独的应用程序来编写相同的数据,因为这意味着必须复制业务逻辑并且必须将更改应用于两个应用程序,即使更改与只有一个应用程序。

【讨论】:

谢谢@Paco。我可以在mysql中使用bigint而不是整数吗? 这对 MySQL 来说是正确的,这就是问题所在,但如果您使用的是 SQL Server,则首选 TimeStamp。另请参阅ayende.com/Blog/archive/2009/04/15/…。 我没有将 NHibernate 版本属性与 mysql 结合使用的经验。我想您可以通过在版本属性映射中指定类型 as long 来将 mysql bigint 映射到 java long。 @Jamie Ide:我不知道。感谢您的提示。

以上是关于休眠乐观锁定..它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中进行乐观锁定

带有休眠和触发器的乐观锁定 - “奇怪”行为

前端如何使用Hibernate乐观锁版本属性?

如何从Java代码编写乐观和悲观锁定

数据库乐观锁和悲观锁的理解和实现

MySQL休眠异常