在工作中,我们正在开发一个RESTful应用程序,其中的数据层将由Hibernate处理。但是我们不确定如何处理实体的更新。
我们计划执行以下操作:
1)客户端通过id请求一个实体
2)Hibernate加载该实体,将请求的字段(始终带有版本)复制到DTO,该DTO转换为JSON并发送给客户端
3)客户端管理一些字段并发送实体(版本号)返回到服务器。
4)服务器接收转换为DTO的JSON。
5)从Hibernate加载相应的实体,并将DTO的props复制到该实体。
=>即使设置了客户端的版本号,该实体也始终会被覆盖。这是否意味着我们总是必须自己检查客户端的版本号与加载实例的版本号,而不是Hibernate这样做?
在具有会话的常规应用程序中,分离的实例保存在HttpSession中。每当客户端更新实体时,都会从HttpSession中检索实例,并更新某些属性。每当Hibernate提交更新时,如果版本号小于当前版本号,则将引发ObjectStaleException。
这里的问题是我们没有Http会话,因为我们试图实现RESTful。
是否存在用于处理RESTful应用程序中的乐观锁定而不是自己检查版本号的通用解决方案?
你的策略很好。只需将来自客户端的版本号复制到加载的实体中(或使用merge()
,将执行相同的操作),并且当Hibernate刷新实体时,如果版本号已增加,则将出现乐观锁异常。
您无需自己检查任何内容。Hibernate为您进行检查。
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也
我有一个用Tapestry5(javawebframework)和Hibernate制作的web应用程序。现在我尝试添加乐观锁定。所以我添加了一个版本属性,乐观的锁定可以工作,所以这很容易,很快。 但是,由于我的web应用程序使用“每个请求一个会话”模式,我不确定利用这种乐观锁定的最佳方式是什么。 发生了什么: 用户 A 打开包含表单的页面,该表单加载了来自实体 A(版本 1)的值。 UserB打
问题内容: 我找不到有关MySQL中乐观锁定的任何详细信息。我读到开始事务使两个实体上的更新保持同步,但是,它不会停止两个用户同时更新数据而引起冲突。 显然乐观锁定会解决这个问题吗?这在MySQL中如何应用。是否有SQL语法/关键字呢?还是MySQL具有默认行为? 谢谢你们。 问题答案: 关键是,乐观锁定不是数据库功能,不适用于MySQL或其他功能:乐观锁定是一种使用带有标准指令的DB进行的实践。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html
乐观锁Version 要使用乐观锁,需要使用version标记 type User struct { Id int64 Name string Version int `xorm:"version"` } 在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值。 var user User engine
本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自