如何利用hibernate3解决数据库丢失更新问题?
2016-05-14 19:07
253 查看
首先我们要明白什么叫丢失更新。
比如数据库有一个person表,里面有一条这样的数据 "5 zhangsan shenzhen";
现在有两个事务A、B同时查找了这一条记录;
A事务修改记录为"5 zhangsan beijing";
提交事务
B事务修改记录为"5 lisi shenzhen";
这时候B事务再去提交或者回滚数据就会出现覆盖A事务已经修改的内容,这种情况就叫做丢失更新。
hibernate3中的解决方法:利用悲观锁、乐观锁
悲观锁:底层原理就是利用了数据库中的for update;
当数据库中select SQL语句上带有for update时,A事务能够查到信息,B在去查的时候就查不到信息,只有当A事务提交事务之后才能查到数据。
在hibernate3中在获取数据时有提供get(Class arg0,Serializable arg1,LockMode arg3)方法,可以在获取数据时给定一个LockMode参数(LockMode.UPGRADE)
一般不用,一般用乐观锁解决
乐观锁:
1.在实体类添加一个属性字段,假如名字叫ver,名字可以随意起,并提供getset方法
2.在对应的映射文件中添加<version name="ver"/>
其它就照常写就行了,在hibernate提交事务时发送的sql是这样子
update .... set ver=? .... where .... and version=?
意思是说在提交事务的时候,hibernate框架会自动检查两次的ver字段是否一致,如果不一致就不让进行更新,如果一致就进行更新
比如数据库有一个person表,里面有一条这样的数据 "5 zhangsan shenzhen";
现在有两个事务A、B同时查找了这一条记录;
A事务修改记录为"5 zhangsan beijing";
提交事务
B事务修改记录为"5 lisi shenzhen";
这时候B事务再去提交或者回滚数据就会出现覆盖A事务已经修改的内容,这种情况就叫做丢失更新。
hibernate3中的解决方法:利用悲观锁、乐观锁
悲观锁:底层原理就是利用了数据库中的for update;
当数据库中select SQL语句上带有for update时,A事务能够查到信息,B在去查的时候就查不到信息,只有当A事务提交事务之后才能查到数据。
在hibernate3中在获取数据时有提供get(Class arg0,Serializable arg1,LockMode arg3)方法,可以在获取数据时给定一个LockMode参数(LockMode.UPGRADE)
一般不用,一般用乐观锁解决
乐观锁:
1.在实体类添加一个属性字段,假如名字叫ver,名字可以随意起,并提供getset方法
2.在对应的映射文件中添加<version name="ver"/>
其它就照常写就行了,在hibernate提交事务时发送的sql是这样子
update .... set ver=? .... where .... and version=?
意思是说在提交事务的时候,hibernate框架会自动检查两次的ver字段是否一致,如果不一致就不让进行更新,如果一致就进行更新
相关文章推荐
- MySQL学习13:操作数据表中的记录(一)
- MySQL修改root密码的多种方法
- Oracle服务测试连接成功,但是用PL/SQL连接提示“无法解析指定的连接标识符”...
- Mysql取某个范围内随机日期 FLOOR和LPAD
- 数据库设计之数据类型
- csv文件导入mysql数据库命令
- Redis 2:简单使用
- Redis 2:简单使用
- SQL—T记录
- T-SQL 常用内置函数和操作(上)
- 怎样将 MySQL 迁移到 MariaDB 上
- mysql触发器案例
- MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志
- mysql root用户看不到mysql库下的所有表
- mysql监控器
- 连接MySQL错误:Can't connect to MySQL server (10060)
- Android中操作数据的集中方式---文件,SQLite,ContentProvider
- 在WebLogic新建针对Oracle数据库的JNDI数据源
- LR连接mysql数据库
- 数据库设计三大范式