最近在学习事务管理方面的知识,看了江南白衣推荐的一本书《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
分享到:
相关推荐
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...
FastAdmin事务管理系统 FastAdmin事务管理系统是一种基于Web的事务管理系统,旨在帮助管理员更好地管理事务流程和数据。下面是该系统的一些重要知识点: 登录 Token 设计 FastAdmin的事务管理系统使用 Token-...
【班级事务管理系统UML】是针对学校班级日常事务管理而设计的一种软件系统,它通过统一建模语言(Unified Modeling Language,简称UML)进行模型化描述和设计。UML是一种标准化的图形建模语言,广泛应用于软件工程...
《个人日常事务管理系统(Java版)详解》 个人日常事务管理系统是现代生活中不可或缺的一部分,它帮助我们有效地组织和管理日常的琐碎事务,确保生活、工作有序进行。本系统采用Java编程语言开发,具备高度的安全性...
Java Web项目企业事务管理系统源码,详细的代码注释 本系统的开发工具具体如下。 ● 系统开发平台:MyEclipse 6.5。 ● 数据库管理系统软件:MySQL 5.0。 ● 运行平台:Windows 2000/Windows XP/Windows 2003/...
本文将详细讲解SSM框架中事务管理的概念、AspectJ的作用以及`aspectjweaver.jar`在事务管理中的应用。 1. **事务管理**:事务是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部回滚,遵循ACID(原子性...
Spring 框架的事务管理是其核心特性之一,它为开发者提供了强大的支持,确保了在多线程和并发环境中数据的一致性和完整性。本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理...
毕业设计—基于Java的Acme班级事务管理系统,已获老师指导并通过的高分项目。 毕业设计—基于Java的Acme班级事务管理系统,已获老师指导并通过的高分项目。毕业设计—基于Java的Acme班级事务管理系统,已获老师指导...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...
Spring.NET是.NET平台上的一个轻量级开源框架,它借鉴了Java界的Spring框架,并提供了诸如依赖注入、面向切面编程以及事务管理等核心功能。在本篇“Spring.NET学习笔记16——事务管理Demo源码”中,我们将深入探讨...
在IT领域,尤其是在数据库编程中,事务管理是一个至关重要的概念。C#作为一种广泛使用的编程语言,提供了丰富的功能来处理事务,确保数据的一致性和完整性。本文将深入探讨C#中的事务管理,包括基本概念、使用场景、...
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 如何使用事务管理删除数据库...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
在SQL Server中,事务管理是数据库操作的核心组成部分,它确保数据的一致性和完整性。这篇博客“事务管理(二)——SQL SERVER的事务管理”可能详细介绍了SQL Server如何处理事务,包括事务的特性、隔离级别以及如何...
JDBC事务管理是数据库操作的重要组成部分,特别是在多用户并发访问数据库的环境中,保证数据的一致性和完整性至关重要。本文主要探讨了事务的基本概念、ACID原则、数据库并发问题以及解决方案。 首先,事务是数据库...