`
shuidexiongdi
  • 浏览: 71746 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

事务管理

阅读更多
最近在学习事务管理方面的知识,看了江南白衣推荐的一本书《Java Transaction Design Strategies》http://www.infoq.com/minibooks/JTDS之后,写点自己对事务的认知。

(一)java事务管理策略如下:
1、本地事务。
2、编程式事务
3、声明式事务

1、本地事务:
   用jdbc进行的connection事务管理。用书中作者的话就是管理的是connection,不是事务。事务交由dbms管理。
2、编程式事务:
   编程式获取UserTransaction,然后UserTransaction.bigin(),UserTransaction.commit(),UserTransaction.roback()对事务进行管理。
3、声明式事务:
   与2相比,就是不用硬编码,只需要告诉容器什么时候开启事务,开启什么样的事务,什么时候提交事务,什么时候回滚事务。(注意:在EJB中发生检查异常(checked exception)时,如果需要回滚事务,需要调用sessionCtx.setRollbackOnly();标识一下该事务需要回滚,容器则根据该标识进行事务的回滚,如果无该标识,则容器不进行回滚。)
  
(二)事务的容器管理级别
1、required
2、mandatory
3、requiresdNew
4、supports
5、Notsupports
6、never
在spring中对应如下:
1、required对应PROPAGATION_REQUIRED:告诉容器调用到指定方法时需要一个事务,如果事务存在,则使用已存在事务,如果事务不存在,则新建一个事务。
2、mandator对应PROPAGATION_MANDATOR:告诉容器调用到指定方法时需要一个事务,但不会新建事务。如果事务不存在,则抛出异常。
3、requiresdNew对应PROPAGATION_REQUIRES_NEW:告诉容器调用到指定方法时需要一个新事务,新事务创建时(称事务2),将旧事务挂起,直至新事务提交或回滚。此时之前已经存在的事务(称事务1)则继续执行,当事务1发生异常时,事务1回滚,事务2不受影响。(该级别对于无论操作是否成功,都已经记录某些动作(如操作记录),的行为很有效)。
4、supports对应PROPAGATION_SUPPORTS:告诉容器调用到指定方法时不需要一个事务。但如果事务已经存在,则加入该事务。(这对查询操作很有用,查询不需要事务,但如果存在事务,事务可能对查询的数据进行update,此时查询可取到事务控制中的最新查询数据)。
5、Notsupports对应PROPAGATION_NOT_SUPPORTED告诉容器调用到指定方法时不需要一个事务。如果事务已经存在,则挂起改事务,等方法执行完毕后再恢复挂起的事务。
6、never对应PROPAGATION_NEVER。告诉容器调用到指定方式时不需要一个事务。如果已经存在事务,则抛出不允许事务的异常。(没必要时建议不要用,很多时候可以用Notsupports代替)。

(三)ejb和spring都支持的事务隔离级别如下:
(说明:事务隔离级别是否有效需要数据库管理系统的支持)
1、TransactionReadUncommitted
2、TransactionReadCommitted
3、TransactionRepeatableRead
4、TransactionSerializable

1、TransactionReadUncommitted:脏读。最低级别的事务隔离级别,允许读取未提交的数据。假如存在事务A和事务B,同时对数据库中的某字段进行如下操作:

则事务A在t2对字段进行了修改,而事务则可在t3读取到修改后的字段值。这种事务隔离级别存在一个问题,即如果事务A在t4进行的是rollback而不是commit的话,则事务B读取到的数据则为脏数据。这种事务隔离级别很多数据库都不支持,包括oracle在内。

2、TransactionReadCommitted:不可重复读。该隔离级别只能读取到事务前或事务后的数据。以上面例子为例:

事务B读取到的是事务A之前和事务A之后的数据(在同一个事务中,会产生前后两次读取的数据不一致),该级别被认为是一个比较好的隔离级别。很多数据库都默认为该级别,如sql servier和oracle。

3、TransactionRepeatableRead:幻读。该隔离级别在一个事务中读取到的数据是一致的,不因为中间数据是否已经修改而重新读取新数据。如下图:

这时读取到的数据不是新数据。就好比事务A并没有对数据进行过修改一样,所以称之为幻读。Mysql默认为该级别。oracle不支持该事务隔离级别。

4、TransactionSerializable:序列执行事务,完全遵循ACID原则,属于最高事务隔离级别,但java对这个隔离级别的支持最低(This is the lowest level of isolatin supported by Java.),如下图:

事务B将被挂起,直至事务A结束。不能并发处理事务。

对于上诉4种隔离级别,需要数据库管理系统的支持才有效,如果数据库系统不支持,则设置的隔离级别是无效的,而采用的是数据库系统的默认隔离级别(但此时系统是不抛出异常的,所以你或许认为你的隔离级别是有效的,但事实上起效果的是默认隔离级别,因此,了解dbms支持的事务隔离级别是很有必要的。)。
  • 大小: 14.3 KB
  • 大小: 15.2 KB
  • 大小: 15.5 KB
  • 大小: 14.8 KB
分享到:
评论
2 楼 xj_eon 2012-03-31  
《Java Transaction Design Strategies》这本书描述的Repeatable read隔离级别,应该是mysql的,这里并没有出现幻读,

幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition.  )

从http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads得知,
mysql对Repeatable read定义不同于其他数据库,它的这个隔离级别并不会出现phantoms。
1 楼 xj_eon 2012-03-30  
这个教材对【TransactionRepeatableRead和幻读】的理解和很多其他帮助文档上理解是不同的。
http://blog.csdn.net/llmlx/article/details/2282978
到底哪个是正确的?

相关推荐

    Java Web项目企业事务管理系统源码

    Java Web项目企业事务管理系统源码,详细的代码注释 本系统的开发工具具体如下。 ● 系统开发平台:MyEclipse 6.5。 ● 数据库管理系统软件:MySQL 5.0。 ● 运行平台:Windows 2000/Windows XP/Windows 2003/...

    毕业设计—基于Java的Acme班级事务管理系统.zip

    毕业设计—基于Java的Acme班级事务管理系统,已获老师指导并通过的高分项目。 毕业设计—基于Java的Acme班级事务管理系统,已获老师指导并通过的高分项目。毕业设计—基于Java的Acme班级事务管理系统,已获老师指导...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    本代码使用H2内存数据库演示spring事务使用,包括编程式事务,声明式事务@Transactional使用,自定义事务事务注解实现自定义事务管理器

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    -全面分析_Spring_的编程式事务管理及声明式事务管理

    Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握。本教程从基础知识开始,详细分析了 Spring 事务管理的使用方法,为读者理清思路。

    班级事务管理系统UML

    本压缩文件内包括了一份用EA编写的班级事务管理系统的文件和一份基于些文件编写的班级事务管理系统分析的文档

    企业日常事务管理系统

    企业日常事务管理系统 为企业内部通信提供最简便的服务!数据库mysql

    Visual C++源代码 112 如何使用事务管理删除数据库记录

    Visual C++源代码 112 如何使用事务管理删除数据库记录Visual C++源代码 112 如何使用事务管理删除数据库记录Visual C++源代码 112 如何使用事务管理删除数据库记录Visual C++源代码 112 如何使用事务管理删除数据库...

    Spring事务管理Demo

    Spring事务管理Demo

    fastadmin事务管理系统

    fastadmin事务管理系统

    数据库期末项目(教学事务管理系统).zip

    本学期分组完成“教学事务管理系统”,具体要求如下: 1. 系统必须是在B/S结构下实现。 2. 数据库在原理1的School数据库基础下自行修改,只能添加,不能删除。 3. 系统具有为不同的角色(系统管理员、教师、学生)...

    鸿言事务管理软件v3.0免费安装版

    鸿言事务管理软件是一款个人事务管理软件,具有事务分类、事务提醒、处理记录和处理进度等功能,事务太多,左支右绌?鸿言事务管理可以帮您解决问题 鸿言事务管理软件官方介绍 鸿言事务管理是用来管理个人事务、...

    教学事务管理系统 java 源代码

    教学事务管理系统 java 源代码很经典的系统

    C#开发的事务管理系统,源代码

    C#开发的事务管理系统 1.日历界面 2.创建指定日期或时间段的事务 3.事务闹铃提醒 4.日记功能,阅读日记的密码保护功能 5.帐号管理,可以切换用户 6.源代码公开 7.ACCESS数据库,无需繁琐的安装步骤即可马上使用 8.C# ...

    班级事务管理系统3.

    班级事务管理是作为一个班级集体管理的一项主要任务,功能完善及安全可靠的管理系统可以大大提高学校资源的利用率,实时准确地了解班级成员与集体的现行状况,同时有助于学校管理。本系统是根据班级事务及各个过程...

    JavaEE的Spring JDBC与事务管理 实验

    3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二、 实验内容 1、在MySQL中创建以下三张表,其中account为账户表,book为书籍信息...

    个人事务管理系统

    设计一个个人事务管理系统 public ResultSet executeSelect(String inquire) throws SQLException { //执行数据库查询操作 rs = stmt.executeQuery(inquire); return rs; } …… …… public boolean ...

    基于java的企业级应用开发:声明式事务管理.ppt

    使用@Transactional注解时,可以通过参数配置事务详情: 5.2.2 基于Annotation方式的声明式事务 * * * * * * * * 声明式事务管理 如何实现Spring的声明式事务管理? 5.2 声明式事务管理 Spring的声明式事务管理可以...

    论文研究 - 基于博客的高校辅导员学生事务管理平台项目

    随着高校规模的逐步扩大,学生事务管理问题如学生过多,辅导员数量不足等问题日益突出。 在这种新情况下,无疑是改变以前的管理模式,并为高校辅导员建立基于博客的学生事务管理平台项目的开创性尝试。 通过将...

    从零开始学iOS7开发系列教程-事务管理软件开发实战

    从零开始学iOS7开发系列教程-事务管理软件开发实战 包括pdf 和源码 一共9章

Global site tag (gtag.js) - Google Analytics