一  事务定义及特性

1、数据库事务的定义:数据库事务(Database Transaction) 是指由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句执行失败,就必须撤销整个工作单元。

以银行转账为例:

2、数据库事务必须具备ACID特征
A: Atomic 原子性:整个事务不可分割,要么都成功,要么都撤销。
C: Consistency 一致性:事务不能破坏关系数据的完整性和业务逻辑的一致性,例如转账,应保证事务结束后两个账户的存款总额不变。
I: Isolation 隔离性:多个事务同时操纵相同数据时,每个事务都有各自的完整数据空间
D: Durability 持久性:只要事务成功结束,对数据库的更新就必须永久保存下来,即使系统发生崩溃,重启数据库后,数据库还能恢复到事务成功结束时的状态。

3、数据库事务的生命周期

 4、声明事务的边界

事务的开始边界(BEGIN)
事务的正常结束边界(COMMIT): 提交事务,永久的保存被事务更新后的数据库状态。
事务的异常结束边界(ROLLBACK): 撤销事务,使数据库退回到执行事务前的初始状态。

5、通过JDBC API来声明事务边界
Connection类提供了用于控制事务的方法:
  setAutoCommit(boolean autoCommit):设置是否自动提交事务
  commit(): 提交事务
  rollback(): 撤销事务

try {
con = java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);
//设置手工提交事务模式
con.setAutoCommit(false);
stmt = con.createStatement();
//数据库更新操作1
stmt.executeUpdate("update ACCOUNTS set BALANCE=900 where ID=1 ");
//数据库更新操作2
stmt.executeUpdate("update ACCOUNTS set BALANCE=1000 where ID=2 ");
con.commit(); //提交事务
}catch(Exception e) {
try{
con.rollback(); //操作不成功则撤销事务
}catch(Exception ex){
//处理异常
……
}
//处理异常
……
}finally{…} 

二  声明事务的开始边界
Transaction tx = session.beginTransaction();
提交事务
tx.commit();
撤销事务
tx.rollback();

三  多个事务并发运行的问题

1、单个事务能保证单项业务的数据完整性,但是当多个事务同步运行时可能带来并发问题,具体体现在:

第一类丢失更新:在撤销一个事务时,把其它事务提交的更新数据覆盖。

脏读:一个事务读到另一事务未提交的更新数据。

虚读:一个事务读到另一事务已提交的新插入的数据。

不可重复读:一个事务读到另一事务已提交的更新数据。

第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。

四  数据库系统锁的基本原理

1、当一个事务访问某种数据库资源时,如果执行select语句,必须先获得共享锁,如果执行insert、update或delete语句,必须获得独占锁。
2、当第二个事务也要访问相同资源时,如果执行select语句,也必须获得共享锁,如果执行insert、update或delete语句,也必须获得独占锁。此时根据已经放置在资源上的锁的类型,来决定第二个事务应该等待第一个事务解除对资源的锁定,还是可以立刻获得锁。

五  锁的分类:

1)从应用程序的角度分为:
(1)悲观锁
(2)乐观锁
2)数据库系统按照封锁程度可分为:
(1)共享锁:用于读数据操作,它非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新它。
(2)独占锁:也叫排他锁,适用于修改数据的场合。他所锁定的资源,其他事物不能读取也不能修改。
(3)更新锁:在更新操作的初始阶段用来锁定可能要修改的资源,这可以避免使用共享锁造成的死锁现象。

六  数据库的事务隔离级别

1、隔离级别的种类

为了解决数据库事务并发运行时的各种问题数据库系统提供四种事务隔离级别:

  Read Uncommitted(读未提交数据):
  它可以防止第一类丢失更新问题,但没有解决脏读以上的并发问题。它的事务隔离性最低。

  Read Committed(读已提交数据):
  它可以防止脏读以下的并发问题,但没有解决不可重复读以上的并发问题。

  Repeatable Read(可重复读):
  它可以防止不可重复读(包括第二类丢失更新)以下的并发问题,但没有解决幻读问题。

  Serializable(串行化):
  提供最严格的事务隔离性。它把事务隔离成连续的一个接一个地执行,而不是并发执行。在这种隔离级别下,不会出现任何的并发问题。

2、隔离级别所能避免能并发的问题

3、设置隔离级别的原则

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

对于多数据应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读,虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序悲观锁和乐观锁来解决。

4、在hibernate中设置隔离级别

JDBC数据库连接使用数据库系统默认的隔离级别。在Hibernate的配置文件中可以显示地设置隔离级别。每一种隔离级别对应着一个正整数。
1:Read Uncommitte
2:Read Committed
4:Repeatable Read
8:Serializable

七  在应用程序中采用悲观锁和乐观锁
1、应用程序中解决不可重复读问题

采用悲观锁和乐观锁的作用:当数据库系统采用Red Committed隔离级别时,会导致不可重复读和第二类丢失更新的并发问题。在可能出现这种问题的场合,可以在应用程序中采用乐观锁或悲观锁来避免这类问题。

2、悲观锁和乐观锁的概念

悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。
乐观锁:就是在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。

3、利用悲观锁协调并发运行的事务

4、使用乐观锁

乐观锁是由应用程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。
在应用程序中,可以利用Hibernate提供的版本控制功能来实现乐观锁。对象-关系映射文件中的<version>元素和<timestamp>元素都具有版本控制功能:
<version>元素利用一个递增的整数来跟踪数据库表中记录的版本
<timestamp>元素用时间戳来跟踪数据库表中记录的版本

<version>进行版本控制:当Hibernate更新一个Account对象时,会根据它的id与version属性到ACCOUNTS表中去定位匹配的记录,假定Account对象的version属性为0,那么在取款事务中Hibernate执行的update语句为:
update ACCOUNTS set NAME=’Tom’,BALANCE=900,VERSION=1
where ID=1 and VERSION=0;如果存在匹配的记录,就更新这条记录,并且把VERSION字段的值加1。当支票转账事务接着执行以下update语句时:
update ACCOUNTS set NAME=’Tom’,BALANCE=1100,VERSION=1
where ID=1 and VERSION=0;由于ID为1的ACCOUNTS记录的版本已经被取款事务修改,因此找不到匹配的记录,此时Hibernate会抛出StaleObjectStateException

乐观锁并发取款事务和支票转账:

八  缓存

缓存是计算机领域的概念,它介于应用程序和永久性数据存储源之间
Hibernate的缓存一般分为3类:
  一级缓存
  二级缓存
  查询缓存

1、Session内的缓存即一级缓存;

2、二级缓存是进程或集群范围内的缓存,可以被所有的Session共享;
二级缓存是可配置的插件;

选择合适的缓存插件,配置其自带的配置文件。
选择需要使用二级缓存的持久化类,设置它的二级缓存的并发访问策略。

3、查询是数据库技术中最常用的操作,Hibernate为查询提供了缓存,用来提高查询速度,优化查询性能
查询缓存依赖于二级缓存

hibernate事务详解相关推荐

  1. java JDBC事务和JTA事务详解

    什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...

  2. Hibernate配置详解

     一.简单介绍   Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate ...

  3. SpringBoot事务详解

    文章目录 一.简介 1.介绍 2.事务特点 3.事务实现方式 3.1 MySql事务实现方式 3.2 SpringBoot实现机制 二.@Transactional详解 1.@Transactiona ...

  4. mysql dba系统学习-数据库事务详解

    mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...

  5. 什么是ZooKeeper?可以做什么?ZooKeeper分布式事务详解篇

    前言 什么是ZooKeeper,你真的了解它吗.我们一起来看看吧~ 一.什么是 ZooKeeper? ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务 ...

  6. Spring源码(八):Spring事务详解

    Spring事务详解 一.事务执行流程 二.Spring事务切面 三.事务切面的Pointcut和Advice 四.注解事务的源码分析 五.Sping事务的传播属性 六.Sping事务的异常校验 七. ...

  7. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  8. spring事务详解

    Spring事务总结 参考 首先,如果整个系统要能实现事务,需要两个方面: Spring开启了事务 MySQL 数据库默认使用支持事务的innodb引擎 1.什么是事务? 事务是逻辑上的一组操作,要么 ...

  9. 事务详解------学而时习之

    spring事务管理(详解和实例) 原文地址: 写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上 ...

最新文章

  1. 亿级流量架构之分布式事务思路及方法
  2. Linux中执行shell脚本的4种方法
  3. 新的UWP和Win32应用程序分发模型
  4. 二调建设用地地类代码_二调土地地类代码表
  5. 【深度学习】基于PyTorch的模型训练实用教程之数据处理
  6. css鼠标悬停样式_利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标
  7. 前端学习(1504):组件通信的几种情况
  8. python环境精简版_【Python专题(一)】Python环境搭建
  9. R语言从初级到精通-张长志-专题视频课程
  10. EndnoteX7/8/9参考文献不按顺序出现
  11. java-php-python-ssm社区志愿者服务管理系统计算机毕业设计
  12. 卡巴斯基密码管理器新版面世,再也不必担心账户安全
  13. php商城系统源码的好处有哪些?
  14. 车载以太网交换机功能和应用案例汇总, 适用于AVB/TSN, 802.1AS(gPTP时钟同步)
  15. linux vi只读文件,linux下vi编辑只读文档无法保存的解决方法
  16. 基于SpringBoot的高并发秒杀(限时秒杀)
  17. 使用window小娜实现文本转语音
  18. 浅析中小企业人力资源管理体系建设
  19. Java Drp项目实战——Drp知多少
  20. 实体店经营的3步锁客裂变

热门文章

  1. 删除某个目录及目录下的所有子目录和文件
  2. 开发大型高负载类网站应用的几个要点
  3. 101.接收上游响应的缓存处理流程
  4. linux程序网络验证,【redhat5.5】linux的LDAP认证服务器的配置及客户端pam网络验证实例...
  5. java业务类_Java_业务层开发
  6. 计算机毕业设计中基于Java和MySQL的图书管理系统
  7. 计算机基础思维导图_超级简单的实操示范,教你零基础带孩子玩转风靡全球的思维导图...
  8. 其利断金前一句是什么_成渝为什么不改成渝蓉?官方答案来了
  9. 将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法
  10. ssm如何支持热部署_最新Spring Boot实战文档推荐:项目搭建+配置+SSM整合