`
shuidexiongdi
  • 浏览: 73242 次
  • 性别: 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
到底哪个是正确的?

相关推荐

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

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务...

    Spring事务管理Demo

    在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...

    fastadmin事务管理系统

    FastAdmin事务管理系统 FastAdmin事务管理系统是一种基于Web的事务管理系统,旨在帮助管理员更好地管理事务流程和数据。下面是该系统的一些重要知识点: 登录 Token 设计 FastAdmin的事务管理系统使用 Token-...

    班级事务管理系统UML

    【班级事务管理系统UML】是针对学校班级日常事务管理而设计的一种软件系统,它通过统一建模语言(Unified Modeling Language,简称UML)进行模型化描述和设计。UML是一种标准化的图形建模语言,广泛应用于软件工程...

    个人日常事务管理系统(java版)

    《个人日常事务管理系统(Java版)详解》 个人日常事务管理系统是现代生活中不可或缺的一部分,它帮助我们有效地组织和管理日常的琐碎事务,确保生活、工作有序进行。本系统采用Java编程语言开发,具备高度的安全性...

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

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

    SSM中事务管理所需的jar包-aspectjweaver

    本文将详细讲解SSM框架中事务管理的概念、AspectJ的作用以及`aspectjweaver.jar`在事务管理中的应用。 1. **事务管理**:事务是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部回滚,遵循ACID(原子性...

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

    Spring 框架的事务管理是其核心特性之一,它为开发者提供了强大的支持,确保了在多线程和并发环境中数据的一致性和完整性。本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异...

    Spring事务管理开发必备jar包

    在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理...

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

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

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

    本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...

    Xml文件配置实现声明式事务管理

    在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...

    Spring.NET学习笔记16——事务管理Demo源码

    Spring.NET是.NET平台上的一个轻量级开源框架,它借鉴了Java界的Spring框架,并提供了诸如依赖注入、面向切面编程以及事务管理等核心功能。在本篇“Spring.NET学习笔记16——事务管理Demo源码”中,我们将深入探讨...

    事务管理(C#)

    在IT领域,尤其是在数据库编程中,事务管理是一个至关重要的概念。C#作为一种广泛使用的编程语言,提供了丰富的功能来处理事务,确保数据的一致性和完整性。本文将深入探讨C#中的事务管理,包括基本概念、使用场景、...

    Spring JDBC与事务管理

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

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

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

    spring hibernate 事务管理学习笔记(二)

    在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...

    事务管理(二)——SQL SERVER的事务管理

    在SQL Server中,事务管理是数据库操作的核心组成部分,它确保数据的一致性和完整性。这篇博客“事务管理(二)——SQL SERVER的事务管理”可能详细介绍了SQL Server如何处理事务,包括事务的特性、隔离级别以及如何...

    JDBC事务管理.docx

    JDBC事务管理是数据库操作的重要组成部分,特别是在多用户并发访问数据库的环境中,保证数据的一致性和完整性至关重要。本文主要探讨了事务的基本概念、ACID原则、数据库并发问题以及解决方案。 首先,事务是数据库...

Global site tag (gtag.js) - Google Analytics