Java事务处理全解析(一)——Java事务处理的基本问题
Java中的事务处理有多简单?在使用EJB时,事务在我们几乎察觉不到的情况下发挥着作用;而在使用Spring时,也只需要配置一个TransactionManager,然后在需要事务的方法上加上Transactional注解就行了。Java的事务处理之所以这么简单是因为框架在背后为我们做了太多的工作。这样,我们虽然可以快速地完成开发工作,但是一旦程序出现问题,在一阵google和stackoverflow之后,你估计还是一筹莫展。作为一个有技术追求的程序员,你应该了解Java事务的底层工作原理。
这是一个关于Java事务处理的系列文章,请通过以下方式下载github源代码:
git clone https://github.com/davenkin/java_transaction_workshop.git
本系列文章将在不依赖Spring和Java EE容器的条件下讲解Java中事务处理的基本方法与原理,包含以下文章:
(一)Java事务处理的基本问题
(二)失败的案例
(三)丑陋的案例
(四)成功的案例(自己实现一个线程安全的TransactionManager)
(五)Template模式
(六)使用动态代理(Dynamic Proxy)完成事务
(七)像Spring一样使用Transactional注解(Annotation)
(八)分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)
(一)Java事务处理的基本问题
Java通过JDBC与数据库进行交互,这是一个如今多数程序员都不会直接使用的技术,我们更倾向于使用Hibernate和Mybatis,但是,他们在底层都需要JDBC与数据库通信,事务处理亦是如此,那么,我们首先来看看JDBC提供的事务处理API。
(1)JDBC提供的事务处理API
JDBC提供的事务处理API非常少,请不要被Spring中事务处理的那一堆源代码所打击得信心尽失,这些框架提供的事务处理功能归根结底主要通过以Connection类的方法完成:
Connection.setAutoCommit(boolean);
Connection.commit();
Connection.rollback();
在Spring的事务处理源代码中,有很多都是处理多线程的,另外一些使用了一些设计模式。不要惊慌,在本系列中(除了系列八),你将看不到任何Spring的影子,我们会通过简单的代码来学习Java事务,学完之后,你可以阅读一下Spring的事务处理源代码,然后将本系列中的事务处理原理与Spring对比,你会发现,Spring要面临与处理的问题也是本系列文章中遇到的问题。
(2)本地事务和分布式事务
本地(Local Transaction)事务指只有一个数据源参与的事务,比如只有数据库或者只有JMS;分布式事务(Distributed Transaction)指有多个数据源同时参与的事务,比如一项操作需要同时访问数据库和通过JMS发送消息,或者一项操作需要同时访问两个不同数据库。对于分布式事务,Java提供了JTA规范,它的原理与本地事务存在不同。 鉴于多数情况下Java事务为本地事务,本系列主要讲解本地事务,而在系列八中有分布式事务的入门例子。
(3)线程安全
线程安全是Java事务处理的一大难点,比如一个DAO类维护了一个Connection实例变量,两个线程同时使用该DAO类与数据库交互,其中一个在使用完Connection后将其关闭,而此时另一个线程正在使用该Connection访问数据库,这时另一个线程对数据库的访问将失败。在本系列的后续文章中,我们将学到如何处理这样的问题并开发线程安全的程序。
(4)Service层和DAO层
通常来说,数据持久化层又分为Service层和DAO层,Service层用于完成与业务逻辑有关的工作,并且Service层包含了工作单元(Unit of work),也即Service层中的方法为事务作用的边界;DAO层用于完成对数据库的实际操作(增删改查)。有时在使用Hibernate或是JPA时我们也会直接在Service层访问数据库而省略掉DAO层。在本系列中,我们会用一个BankService例子贯穿始终。该BankService用于将用户银行账户(Bank Account)中的存款转帐到该用户的保险账户(Insurance Account)中,两个账户对应有不同的数据库表。
BankService需要两个DAO类协同起来工作,一个负责银行账户表的操作,另一个负责保险账户表操作,这是一个典型的事务处理例子。在下一篇文章中,我们将学习一个关于该BankService事务处理失败的案例。
Java事务处理全解析(一)——Java事务处理的基本问题的更多相关文章
- 《Java面试全解析》505道面试题详解
<Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...
- 《Java面试全解析》1000道面试题大全详解(转)
<Java面试全解析>1000道 面试题大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃 ...
- Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)
在本系列的上一篇文章中,我们讲到了使用动态代理的方式完成事务处理,这种方式将service层的所有public方法都加入到事务中,这显然不是我们需要的,需要代理的只是那些需要操作数据库的方法.在本篇中 ...
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
在本系列的上一篇文章中,我们讲到了使用Template模式进行事务管理,这固然是一种很好的方法,但是不那么完美的地方在于我们依然需要在service层中编写和事务处理相关的代码,即我们需要在servi ...
- Java事务处理全解析(五)—— Template模式
在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理. Te ...
- Java泛型全解析【接口、类、封装类型】
目录 1.导读 2.为何需要泛型? 3.泛型的定义格式 3.泛型的好处 4.什么时候使用泛型? 5.泛型的擦除 6.泛型的补偿 7.泛型的应用 7.1[泛型类] ...
- Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)
在本系列的上一篇文章中我们讲到,要实现在同一个事务中使用相同的Connection对象,我们可以通过传递Connection对象的方式达到共享的目的,但是这种做法是丑陋的.在本篇文章中,我们将引入另外 ...
- Java事务处理全解析(三)——丑陋的案例
在本系列的上一篇文章中,我们看到了一个典型的事务处理失败的案例,其主要原因在于,service层和各个DAO所使用的Connection是不一样的,而JDBC中事务处理的作用对象正是Connectio ...
- Java事务处理全解析(二)——失败的案例
在本系列的上一篇文章中,我们讲到了Java事务处理的基本问题,并且讲到了Service层和DAO层,在本篇文章中,我们将以BankService为例学习一个事务处理失败的案例. BankService ...
随机推荐
- 精妙无比 8款HTML5动画实例及源码
1.jQuery垂直带小图标菜单导航插件 今天我们要来分享一款jQuery菜单插件,这款jQuery菜单是垂直的样式,鼠标滑过菜单项时会出现一个背景,菜单项的右侧也会出现一个小箭头.另外值得注意的是, ...
- 5 款傻瓜式手机 APP 开发工具
http://www.oschina.net/news/21552/5-app-creators
- 关于HTML的Element
今天搞HTML的时候,发现了一些操作element的方法.先引用一篇. 1.document.getElementById(id); 2.document.getElementByTagName(t ...
- HDU 5957 Query on a graph
HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图. 有\(M \le 10^5\)操作: ...
- linux之du命令
du命令:disk usage,顾名思义,是关于目录使用情况的.对了- 它的作用就是计算目录大小的. 1. 想看当前目录下所有目录以及子目录的大小: # du -h . “.”代表当前目录下.也可以换 ...
- 越狱Season 1-Episode 17: J-Cat
Season 1, Episode 17: J-Cat -Pope: Hey, that's looking good. 嗨,看起来真棒 You're making some real progres ...
- click 绑定(一)无参数的click 事件绑定
目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 例子 <d ...
- Python爬虫学习笔记——豆瓣登陆(一)
#-*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup import html5lib import re import ...
- Android-Universal-Image-Loader开源项目的简要说明及使用实例
本文转载于:http://www.cnblogs.com/hsx514/p/3460179.html 一.核心类的说明及相关参数的说明 ImageLoaderConfiguration 1.作用:为I ...
- 防止 SQL 注入的方法(摘抄)
——选自<深入Ajax : 架构与最佳实践 = Advanced Ajax : architecture and best practices/ (美)Shawn M.Lauriat著:张过,宋 ...