Java中事务处理的基本方法与原理,包含以下文章:

(一)Java事务处理的基本问题

(二)失败的案例

(三)丑陋的案例

(四)成功的案例(自己实现一个线程安全的TransactionManager)

(五)Template模式

(六)使用动态代理(Dynamic Proxy)完成事务

(七)像Spring一样使用Transactional注解(Annotation)

(八)分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)

使用事务

(1)当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:

(2)JDBC控制事务语句

Connection.setAutoCommit(false); //  相当于start transaction

Connection.rollback();  rollback

Connection.commit();  commit

事务

什么是事务?事务通俗的讲就是要做的事,在计算机术语中一般指访问或更新数据库中数据的一个工作单元。说起事务,那么就要提到事务的ACID特性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。可是为什么说起事务就要提到这四个特性,这四个特性是一个事务必须遵守的标准呢还是对事务的一个期望目标呢,对于这个疑问,我有自己的理解。

事务通俗的将是要做的事,那么事务的特性就类似于操作规范,按照操作规范来做事就可以尽量避免发生措手不及的问题,最终把事情做好。如果把要做的事拆解一下,通常的步骤就是准备,定好目标,执行,获得结果。对于计算机事务来说,执行一个工作单元,正确完成对数据库的访问或更新,使数据库从一种状态转换成另一种状态,这个执行过程就是计算机事务。如何从事务开始到结束来保证它的正确性,实现最终目标,这需要靠每个步骤上的正确执行来保证得到最后的正确结果。为了保证每个步骤的正确执行,就有了这四个特性。

事务特性

为了说明事务的特性,举个窗口购买火车票的例子。首先简单的分析一下,在购买火车票之前我们需要准备好身份证件和现金,最终结果是我们支付现金并且获得火车票。但是如果购票业务没做好,会出现那些情况呢。下面大致列举一下:

1、乘客得到了火车票却没有给售票员付钱。

2、在办理购票业务的时候提示票已售完。

如果现实中真的出现了这些问题,那是谁都不愿意的看到的。因此为了保证购票业务的正确执行,必须把付钱和得到火车票看成一个整体,要么付钱并得到火车票,要么退钱结束购票。

而且在购票的过程中,便锁定客户的票,不能让它被其他窗口买走。

例子是这样一个简单的例子,但用来说明事务的特性却是足够了。

  • 原子性

原子性即不可分割性,含义是一个事务必须把它产生的所有更改作为一个单独的工作单元进行提交或者回滚。无论有多少变动都将作为一个整体来处理。怎么来保证事务的原子性首先在事务开始之前对事务进行拆解,分析哪些动作是必须同时成功,同时失败的,把这些绑在一起的动作看成一个完整的工作单元,这些动作要步调一致。这其实也就是做好一件事之前的准备阶段。用窗口购票的例子来说就是把乘客付钱和得到火车票看成是一个整体。

  • 一致性

一致性的意思是事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态(其实也就意味着在事务期间,对数据的增删改要符合数据的完整性约束)。像这种比较正式的说法往往是用一个抽象的描述去形容另外一个抽象的东西,结果是更加糊涂了。购票这个例子中,所谓的一致性就是现金必须从乘客的手中扣除,而同时火车票也必须被卖出并交到乘客的手上。所以简单点说,就是工作单元中每个动作的执行结果必须被落实,不能出现有的成功了而有的失败了。这就是做好一件事所要达到的既定目标,只要当这件事的所有环节都完成以后才能算这件事完成了。

  • 隔离性

隔离性,在有的地方也叫独立性,其实意思都差不多。隔离性指的是各个独立事务之间的交互程度,是由一致性和并发性共同决定的。像购票的这个例子,如果同时有多名乘客在不同的窗口购票,如果处理不当,很可能在购票的时候会出现两个或两个以上的窗口锁定同一张火车票,并进行售卖的情况,最终不能保证事务的一致性。并发性越低,事务的隔离性越高,一致性也就越高。当提高事务的隔离性的时候,就很可能需要牺牲数据库的并发性来保证数据的一致性。所以当设置事务的隔离级别的时候,就需要综合考虑事务的一致性和并发性。因此通俗讲事务的隔离性就是指的事情应该怎么做。关于事务的隔离性以及隔离级别稍后会有详细说明。

  • 持久性

持久性指的是一个事务一旦提交,那它对数据库的更改就应该是永久的,不会因系统的失败而丢失。当完成购票以后,售票员得到乘客的车票钱,乘客得到售票员给的车票,不能因为售票系统的崩溃就对既有事实进行抵赖,所以从某种程度上来说,持久性也可以指不可抵赖性,签字盖章,交易完成。这就是事情的最终结果。

PS:把事务理解成将要做的事,从自己如何确保做好一件事的角度来考虑就比较容易理解事务的几个特性,毕竟我们自己也做过很多事,也遇到过各种各样的问题。比如比如项目组成员共同开发项目,一人一个模块,有的人完成了,有的人没完成,导致项目整体进度出现异常,这些都说明了事务的原子性和一致性。手头正做着工作,突然上头又让做别的工作,杂七杂八的,最终原本的工作不一定能按时完成,包括代码的检出、检入的时候出现的代码冲突和覆盖等问题,也都体现了事务的隔离性。工作的沟通中,口头说的容易忘,也很容易需求变更,这时候就需要编写需求说明,需求分析以及详细设计等文档以及保留来往邮件作为结果产物作为依据。

 
 

java事务(一)的更多相关文章

  1. 转!!java事务的处理

    java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先前 ...

  2. 深入Java事务的原理与应用

    一.什么是JAVA事务    通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 ( ...

  3. java事务的类型——面试被问到

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 1.JDBC事务 JDBC 事务是用 Connection 对象控制的.JDBC Conne ...

  4. java事务管理

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  5. java事务的处理

    java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务. 如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先 ...

  6. 分布式事务(二)Java事务API(JTA)规范

    一.引子 既然出现了分布式场景(DTP模型), 大java也及时制定出一套规范来给各大应用服务器.数据库/mq等厂商使用,以方便管理互通--->JTA闪亮登场.JTA(Java Transact ...

  7. java事务 深入Java事务的原理与应用

    一.什么是JAVA事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...

  8. java 事务

    之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解. 关于事务的基础知识这里不再详细介绍,想要了解的同学可以在我的博客中阅读 ...

  9. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  10. java事务(三)

    java事务(三)——自己实现分布式事务 在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在J ...

随机推荐

  1. CF1153E Serval and Snake(交互题)

    题目 CF1153E Serval and Snake 很有意思的一道交互题 做法 我们观察到,每次查询一行,当这一行仅包含一端是返回的答案是奇数 根据这个性质查询每一行每一列,我们大体能知道两端的位 ...

  2. Codeforces679E. Bear and Bad Powers of 42

    传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...

  3. mysql left join中where和on条件的区别

    left join中关于where和on条件的几个知识点: 1.多表left join是会生成一张临时表,并返回给用户 2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件 ...

  4. linux版本安装pip

    因为一直在windows开发python程序,今天把python程序打成docker image镜像的时候,发现pip无法使用,并且使用yum 也无法安装,查找资料发现下面方法可用 1.python ...

  5. 学习记录:交叉编译环境配置(buildroot and gdb&gdbserver)【转】

    本文转载自:https://blog.csdn.net/zhy025907/article/details/52332528 1,背景 因为参加公司的路由器逆向培训,首先需要的就是环境的配置准备工作, ...

  6. TCP/IP的相关协议

  7. Spring中RestTemplate进行Http调用

    Spring中的RestTemplate类源自spring-web,http调用中设置超时时间.设置连接池管理等非常重要,保证了系统的可用性,避免了长时间连接不上或者等待数据返回,拖垮系统. 现贴出工 ...

  8. mybatis动态sql中的bind绑定

    知识点:bind在模糊查询中的用法 在我的博客    mybatis中使用mysql的模糊查询字符串拼接(like) 中也涉及到bind的使用 <!-- List<Employee> ...

  9. 正则表达式-RegExp-常用正则表达式

    正则表达式-RegExp-常用正则表达式   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源 ...

  10. IO与NIO

    IO IO概念: Java IO Java IO 即java的输入系统,不管我们编写任何种语言,都难免输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,还要考虑的因素特别多,比如我们要考 ...