1.前言

上一篇博客解说了Hibernate中的一级缓存,属于Session级别的。这篇博客解说一下Hibernate中的事务机制。

有关事务的概念。请參照通俗易懂数据库中的事务

 2.怎样处理Hibernate中的事务

我们知道数据库中的事务,会造成一些影响。比方脏读、不可反复读、幻读。

那么怎样解决这些问题呢?

1.隔离级别设置

通过设置数据库的隔离级别能够消除一些影响。请參照博客通俗易懂数据库中的事务

在hibernate中也有四种隔离级别,各自是

1—Read uncommitted isolation

2—Read committed isolation

4—Repeatable read isolation

8—Serializable isolation

假设要设置hibernate的事务隔离级别的话,直接加入例如以下语句就可以

<span style="font-family:SimSun;font-size:18px;"><!-- 设置事务隔离级别 -->
<property name="hibernate.connection.isolation">4</property></span>

2.丢失更新怎样解决

悲观锁

採用数据库内部锁的机制。在一个事务操作数据时。为数据加锁。还有一个事务无法訪问。例如以下所看到的:

<span style="font-family:SimSun;font-size:18px;">Customer customer = (Customer) session.load(Customer.class, 1,LockMode.UPGRADE); </span>

採用上述后,在查询数据时 加入排它锁,默认生成的SQL语句例如以下

select * from customers for update;

解释:採用排他锁的话。一旦锁住,别人就无法訪问。

乐观锁

乐观锁与数据库无关。在数据表中为数据加入版本号字段,每次数据改动都会导致版本号号+1

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

分析,正如上图所看到的,每一个事务之前都会先去拿一下版本号字段,当改动完毕提交时,会再去核对一下眼下拿到的版本号字段与数据库是否一致,假设不一致的话就会报错。

用的时候仅仅需在定义中增加版本号字段就可以

<span style="font-family:SimSun;font-size:18px;"><!-- 定义版本号字段 -->
<!-- name是属性名 -->
<version name="version"></version>
</span>

最新文章

  1. 15 个实用的 PHP 正则表达式
  2. hdu 1873 看病要排队(优先级队列)
  3. 每天一个linux命令(45):route命令
  4. JS回调函数(callback)
  5. 存储过程Oracle学习(一)
  6. tomcat生成ssl证书
  7. Java框架的思考
  8. 将CMD内的显示内容输出到txt文件
  9. PHP面向对象基础实例
  10. js里父页面与子页面的相互调用
  11. [bzoj1706] [usaco2007 Nov]relays 奶牛接力跑
  12. Babel学习小记
  13. TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践
  14. CentOS安装教程(VMware)
  15. MVC 区域路
  16. CI框架 -- 文件结构
  17. 完美解决Android SDK Manager无法更新
  18. promise-async-await
  19. C++很“虚”
  20. Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载

热门文章

  1. hdu2089不要62(数位dp)
  2. caffe介绍
  3. P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)
  4. 快速录入快递地址API接口实现
  5. python--2、数据类型
  6. OC对象的本质及分类
  7. html5 web worker学习笔记(记一)
  8. IN、EXISTS的相关子查询用INNER JOIN 代替--性能优化
  9. 06--谈谈:C++类的“包含”机制
  10. grep命令总结