jTransactions

声明式事务工具
授权协议 Apache
开发语言 Java
所属分类 程序开发、 其他开发相关
软件类型 开源软件
地区 国产
投 递 者 楚硕
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

jTransactions

开源协议: Apache 2.0

jTransactions是一个声明式事务工具,目的是将Java的事务功能独立出来,做成一个单独的库来使用

jTransactions目前仅包含两个实现: TinyTX和SpringTx。

TinyTX是一个微型的只有4个文件组成的、具有简单功能的声明式事务服务,是Spring事务之外一个小巧的选择。

SpringTx是对Spring声明式事务的包装,SpringTx适用于开发复杂的大型项目(例如使用到了嵌套事务),使用SpringTx需要在项 目中添加对Spring库的依赖。原则上,除了TinyTx外,jTransactions不重新开发自已的事务实现,其它事务服务如Spring事务、JTA事务、EJB容器事务等将只做简单的包装容纳进这个项目,jTransactions与具体实现的关系正如common-log与Log4J的关系,一个是接口,一个是具体的实现。

jTransactions是一个可扩充的架构,将来可能会不断有新的事务实现添加进来。jTransactions运行环境为Java6或以上。

如何引入项目?

方式一:手工下载jtransactions-1.0.0.jar并放置于项目的类目录。

方式二:在项目的pom.xml文件中加入如下行:

   <dependency>  
      <groupId>com.github.drinkjava2</groupId>  
      <artifactId>jtransactions</artifactId>  
      <version>1.0.0</version>  
   </dependency>

注:

  1. 如果只使用TinyTX,以上配置就可以了。如果使用SpringTx, 还需要在pom.xml中添加对Spring-tx的依赖。

  2. jTransactions还必须与一个支持AOP Alliance接口规范的AOP工具如Spring或jBeanBox配合使用,因为声明式事务的基本原理是对方法的拦截,必须有一个AOP工具来实现这个功能。

  3. jTransactions还必须一个JDBC工具配合使用,如纯JDBC、JdbcTemplate、DbUtils-pro或jSqlBox等。

介绍

jTransactions分为连接管理器ConnectionManager和CommonTx两个接 口,ConnectionManager接口的实现类的两个方法,getConnection和releaseConnection,如使用纯JDBC, 必须用这两个方法来获取和释放连接。如使用一些工具类如JdbcTemplate、DbUtils-Pro和jSqlBox等,其内部获取和释放连接已经 调用这两个方法,所以无需关心连接的获取和释放。 CommonTx实现类是由框架来提供,用户不必关心实现细节,只需要利用AOP工具配置使用 即可。具体使用见下面示例。

一. TinyTx和SpringTx声明式事务演示 TinyTx是一个核心只有4个类组成的微型的声明式事务实现,它旨在小项目中替代复杂的Spring声明式事务,在精简尺寸的同时达到降低学习成本、提高项目的掌控感(即可维护性)的目的。其功能比较简单,只要发现有未捕获的任何异常即回滚事务,可用于小型项目的开发。SpringTx是对Spring 事明式事务的包装,功能完备,适用于大型项目。

以下是演示jTransactions与jBeanBox搭配的用法,这个示例实现了在运行期动态在TinyTx和SpringTx两个事务提供者之间切换。

public class TxTester {
	private static Class<?> tx = TinyTx.class;
	private static ConnectionManager cm = TinyTxConnectionManager.instance();

	public static class TxBox extends BeanBox {
		{
			this.setConstructor(tx, BeanBox.getBean(DataSourceBox.class), Connection.TRANSACTION_READ_COMMITTED);
		}
	}

	TinyJdbc db = new TinyJdbc((DataSource) BeanBox.getBean(DataSourceBox.class), cm);

	@AopAround(TxBox.class)
	public void tx_Insert1() {
		db.executeSql("insert into users (id) values('123')");
	}

	@AopAround(TxBox.class)
	public void tx_Insert2() {
		db.executeSql("insert into users (id) values('456')");
		Assert.assertEquals(2L, db.queryForObject("select count(*) from users"));
		System.out.println("Now have 2 records in users table, but will roll back to 1");
		System.out.println(1 / 0);
	}

	public void doTest() {
		try {
			db.executeSql("drop table users");
		} catch (Exception e) {
		}
		db.executeSql("create table users (id varchar(40))engine=InnoDB");
		Assert.assertEquals(0L, db.queryForObject("select count(*) from users"));
		try {
			tx_Insert1();// this one inserted 1 record
			tx_Insert2();// this one did not insert, roll back
		} catch (Exception e) {
			System.out.println("div/0 exception found, tx_Insert2 should roll back");
		}
		Assert.assertEquals(1L, db.queryForObject("select count(*) from users"));
	}

	@Test
	public void userTinyTx() {
		TxTester tester = BeanBox.getBean(TxTester.class);
		tester.doTest();
		BeanBox.defaultContext.close();// Release DataSource Pool
	}

	@Test
	public void testSprintTx() {
		tx = SpringTx.class;
		cm = SpringTxConnectionManager.instance();
		TxTester tester = BeanBox.getBean(TxTester.class);
		tester.doTest();
		BeanBox.defaultContext.close();// Release DataSource Pool
	}
}

以上即为jTransactions全部文档,如有疑问,请下载并运行单元测试示例或查看源码。

后记:关于这个项目,本来我没打算开发它,在开发DbUtils-Pro和jSqlBox项目时,需要找一个小巧点的独立的事务工具,原以为这方面 的开源项目会有一大把,但很遗憾的是,我一个也没有找到!只好自已从头写一个TinyTx,水平很烂,但是勉强能够工作了。 至于为什么不直接用Spring事务是因为它太大了、太占内存、太复杂,太多标签、太多依赖,绑死在Spring环 境中无法抽取出来,使用Spring的声明式事务要加上一堆库依赖,其中居然有JdbcTemplate库,事务服务依赖于JDBC工具,难道这就是 Spring号称的反转依赖不成? 至于jfinal的事务服务,看了一下源码,比较简单,但是依然写死在了Jfinal环境中,不能抽取出来给其它持久层工具使用,而且它没有和数据源绑 定。jTransaction的架构是开放式的,甚至充许在运行期动态切换事务服务。今后如果有人发现了什么比较好用的事务工具也可以告诉我,我可将它包 含到这个项目中来。目前下一步的开发打算是将一个现成的JTA事务实现集成进来。

  • (English instruction please see README-ENGLISH.md ) jTransactions jTransactions是一个事明式事务工具,目的是将Java的事务(及声明式事务)功能独立出来,做成一个通用、独立的库来使用,无论什么DAO工具,借助于jTransactions,都可以用相似的配置方式进行声明式事务配置,jTransactions运行环境为Jav

 相关资料
  • 声明式事务, 可以脱离Trans类实现单个方法或多个的事务模板. 例如设置Service类所有insert开头的方法,均应用READ_COMMITTED事务 声明式事务,是通过aop拦截器做的, 而aop依赖ioc, 在@IocBy注解中启用即可. @IocBy(type=ComboIocProvider.class, args={"*json","org/nutz/mvc/testap

  • 本文向大家介绍SpringBoot 注解事务声明式事务的方式,包括了SpringBoot 注解事务声明式事务的方式的使用技巧和注意事项,需要的朋友参考一下  springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置。我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了。但是xm

  • 10.5. 声明式事务管理 大多数Spring用户选择声明式事务管理。这是对应用代码影响最小的选择,因此也最符合非侵入式轻量级容器的理念。 Spring的声明式事务管理是通过Spring AOP实现的,因为事务方面的代码与Spring绑定并以一种样板式风格使用,不过尽管如此,你一般并不需要理解AOP概念就可以有效地使用Spirng的声明式事务管理。 从考虑EJB CMT和Spring声明式事务管理

  • 本文向大家介绍SpringMVC+MyBatis声明式事务管理,包括了SpringMVC+MyBatis声明式事务管理的使用技巧和注意事项,需要的朋友参考一下 采用的基本搭建环境:SpringMVC、MyBatis、MySQL、tomcat         Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,然后在不同的

  • 本文向大家介绍spring声明式事务管理解析,包括了spring声明式事务管理解析的使用技巧和注意事项,需要的朋友参考一下 前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解。 本文内容:   1、了解什么是声明式事务?   2、声明式事务管理分别有哪几种?   3、这几种事务管理之间的区别是什么? 一、什么是声明式事务?   声明式事务(decl

  • 声明式事务管理方法允许您在配置的帮助下管理事务,而不是源代码中的硬编码。 这意味着您可以将事务管理与业务代码分开。 您只能使用注释或基于XML的配置来管理事务。 bean配置将指定要进行事务的方法。 以下是与声明性交易相关的步骤 - 我们使用标签,它创建一个事务处理建议,同时我们定义一个切入点,匹配我们希望进行事务的所有方法并引用事务建议。 如果事务配置中包含方法名称,则创建的通知将在调用方法之前

  • 9.4 声明式事务 9.4.1 声明式事务概述 从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量。 本节将介绍声明式事务支持,使用该方式后最大的获益是简单,事务管理不再是令人痛苦的,而且此方式属于无侵入式,对业务逻辑实现无影响。 接下来先来看看声明式事务如何实现吧。 9.4.2 声明式实现事务管理 1、定义业务逻辑实现,此处使用ConfigUserSer

  • 本文向大家介绍springboot开启声明式事务的方法,包括了springboot开启声明式事务的方法的使用技巧和注意事项,需要的朋友参考一下 springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatl