在高并发的计算机群组成的负载均衡环境中,经常会碰到多个节点更新同一条数据,从而引起数据不一致的问题!
场景
有 A ,B 2台WEB服务器,负载均衡处理请求, C为数据库服务器, 有订单Order, 订单初始的金额为 300
如果 A B同时调整订单金额 减少100元,将会存在如下情况。
A -> Order.amount(200) -100 = 200
B -> Order.amount(200)- 100 = 200;
但是原本是 A ,B 分别减少100 ,正确的Order.amount的最终值应该是 100, 而现在变成了 200,这个错误的值
如果你的系统采用原生的SQL 那么在做Update操作的时候,是不会存在这个问题
- updateordersetamount=amount-100whereid=xxxx
update order set amount=amount -100 where id=xxxx
由数据库进行并发同步。
可是我们在开发JAVA系统时,大多数都会采用Hibernate这种ORM框架,所以在做更新操作的时候,是不太可能直接写SQL, 往往都会先读取实体的值,再进行Update操作,那么就会出现上面所说的问题。
在解决这类问题时,我们想到的就是采用数据库的乐观锁原理。 给数据库表添加一个version的版本号字段,每次更新的时候都会带上这个version作为where 条件,如果更新的记录返回为0条,表示数据已经被其它人所修改
在Hibernate3的时候,已经有一个@Version的标签,只要给实体标记就可以了,每次Update操作的时候,都会自动带上这个 version条件
- @Entity
-
publicclassVersionTest{
-
-
privateLongid;
-
privateIntegerversion;
-
-
privateBigDecimalamount;
-
-
@Id
-
@Column(name="oid")
-
@GeneratedValue
-
publicLonggetId(){
-
returnthis.id;
- }
-
-
publicvoidsetId(Longid){
-
this.id=id;
- }
-
@Version
-
@OptimisticLock(excluded=true)
-
publicIntegergetVersion(){
-
returnversion;
- }
-
publicvoidsetVersion(Integerversion){
-
this.version=version;
- }
-
publicBigDecimalgetAmount(){
-
returnamount;
- }
-
publicvoidsetAmount(BigDecimalamount){
-
this.amount=amount;
- }
-
-
- }
分享到:
相关推荐
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
hibernate jpa开发需要的所有包 jpa-jar包 hibernate开发
开发hibernate jpa 依赖的所有jar,mysql 驱动jar包等。
该套是HibernateJPA的完整JAR包,只需导入全部jar包就可搭建Hibernate jpa对MySQL数据库的持久化操作
HibernateJPA+Struts2.0+MariaDB实现登录功能
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
hibernate jpa 用到的所有jar
包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注
修改jdbc.properties 运行起来后 ,输入地址 localhost:8080/ajie-wechat/saveUser.htm 数据库有数据表示成功
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
Spring hibernate jpa Project sample
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
SpringMVC +Hibernate JPA+Spring-data-jpa实例 是入门的实例。
一个简单的maven项目演示spring 整合 hibernate jpa2 实例,使用 mvn test 运行。
在JavaSE下使用HibernateJPA所需的jar包
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.final.jar.zip,内含hibernate-jpa-2.1-api-1.0.0.final.jar
Spring Hibernate JPA与常用JAR包详解,非常全面,将每个包的依赖包也有详细的说明
hibernate-jpa.jar
源代码 博文链接:https://lizycst.iteye.com/blog/1935607