`
AreYouOK?
  • 浏览: 57296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Apache Commons Transaction实现的文件事务

阅读更多

http://commons.apache.org/transaction/

有这么一个东西,其中的file包用来实现文件事务,不过具体实现方式实在不敢恭维。它完全依靠文件系统来保证它的事务,例如,它假设文件的删除、覆盖操作是一个原子操作,这样,当一个事务要修改任何一个文件的时候,它都是给你一个OutputStream,这个流输出到一个临时目录。提交的时候,它把用临时目录中的文件覆盖真正的文件。

也就是说,它不支持随机写
,假如有一个10M的文件(或者100M或者更大),哪怕一个事务中只修改一个字节,也要写10M,性能实在很差。如果仅仅是这样,对于
很多对性能没有要求的应用来说,应该还是不错的。

但它好像还有更多的问题。可以做一个实验,大致如下:
try{
  开始事务
  删除文件1
  删除文件2
  提交
}catch(){
  回滚
}
我们用点手段锁住文件2,让这个文件删不掉,然后运行这个程序,同时结合源代码进行跟踪,并观察存储目录和临时工作目录的文件情况。结果发现:
1、提交的时候,当删除第一个文件的时候,它并没有把文件1复制到临时工作目录。文件1真的被删除了,这样当删文件2出错的时候,回滚是不可能的。
2、当删除文件2出错,并且代码执行到回滚的时候。真的出现了异常,说是数据库已经处于dirty的状态,不能操作了。这种情况等于是需要手工干预了。这个时候文件1被删除,文件2还在。
3、解除文件2的锁定,下次重启FileResourceManager的时候,会尝试进行恢复,结果是两个文件都被删掉。如果没有解除锁定,重启 FileResourceManager还要出错。

我觉得是非常不应该的,这样就机会没法用了,不知道他们怎么想的,还是我弄错了?

分享到:
评论
2 楼 webwiki 2011-12-27  
不好意思,刚才想当然的说了一下,试了试发现说错了,补充一下:
1)应该这么判断:
                        frm.startTransaction(txId2);
frm.deleteResource(txId2, resId1);
frm.deleteResource(txId2, resId2);
int vote = frm.prepareTransaction(txId2);
System.out.println(vote);
if (vote == FileResourceManager.PREPARE_SUCCESS) {
frm.commitTransaction(txId2);
} else {
frm.rollbackTransaction(txId2);
}
2)确实锁定了文件2时,commit会失败(实际上这个事务还未真正完成)。在提交失败后,一旦文件锁获得释放,就可以通过frm.recover()操作最终完成这个事务,保证事务的完整性。

webwiki 写道
看你写的挺认真的,但是分析的却很不得法,你大概是不太了解两阶段事务的概念。这个要这么写才对,如下:

try{
  开始事务
  删除文件1
  删除文件2
  int vote =   prepare()
  if(vote==XAResource.XA_OK){
    提交
  } else {
    回滚
  }
}catch(){
  回滚
}

这个项目做的还是挺好的,至少不至于连这么简单的问题都弄不好,否则那还有人用啊。

1 楼 webwiki 2011-12-27  
看你写的挺认真的,但是分析的却很不得法,你大概是不太了解两阶段事务的概念。这个要这么写才对,如下:

try{
  开始事务
  删除文件1
  删除文件2
  int vote =   prepare()
  if(vote==XAResource.XA_OK){
    提交
  } else {
    回滚
  }
}catch(){
  回滚
}

这个项目做的还是挺好的,至少不至于连这么简单的问题都弄不好,否则那还有人用啊。

相关推荐

    Apache Commons DbUtils 1.6 API

    `DbUtils`还提供了一些辅助方法来处理事务,如`beginTransaction()`, `commit()`, `rollback()`,使事务管理变得更加简单。这些方法可以与`ConnectionHelper`一起使用,确保在出现错误时正确地回滚事务。 7. **...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    在 Spring 2.5 中,可以使用 JTA(Java Transaction API)来实现分布式事务管理。 JTA 是一个 Java 标准,用于提供分布式事务管理的支持。它可以使得事务跨越多个资源管理器,确保事务的一致性。 在 Spring 2.5 中...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-transaction 处理多级事务的集合 commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则 commons-vfs 虚拟文件系统 httpcomponents-client 和 http 协议...

    commons-dbcp2-2.2.0-bin.zip

    4. **事务管理**:DBCP2可以与JTA(Java Transaction API)集成,支持分布式事务处理。 5. **性能优化**:DBCP2提供了多种优化选项,如空闲连接检测、连接池的预热、公平锁机制等,以提升整体性能。 6. **异常处理...

    Jakarta commons docs API CHM 格式

    commons-transaction 处理多级事务的集合 commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则 commons-vfs 虚拟文件系统 httpcomponents-client 和 http 协议...

    spring + JTA + JOTM实现分布式事务

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    Spring3_jar.zip

    10. `com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar`:Apache Commons DBCP,一个基于Apache Commons Pool的数据库连接池实现。 这些库共同构成了Spring框架的核心,为开发者提供了强大的工具集,以...

    commons-dbutils-1.5

    Apache Commons DBUtils是Java开发中一个非常实用的数据库操作库,尤其在处理简单和重复的数据库访问任务时,它提供了一种简洁、高效的方式。这个"commons-dbutils-1.5"版本是DBUtils项目的早期稳定版本,它包含了对...

    spring+jotm 多数据源事务管理(二)hibernate

    本篇文章将聚焦于如何结合Spring和JOTM(Java Open Transaction Manager)来实现多数据源的事务管理,特别是针对使用Hibernate的情况。 JOTM是Java平台上的一个开放源代码事务管理器,它遵循JTA(Java Transaction ...

    Spring3+Hibernate3所需包及配置文件

    7. `commons-logging.jar`:Apache Commons Logging,一个日志抽象层,允许选择不同的日志实现。 在配置Spring与Hibernate的整合时,通常需要以下步骤: 1. **引入依赖**:在项目的`pom.xml`(如果使用Maven)或...

    spring3+hibernate4声明式事务配置(xml方式)

    3. **配置DataSource**:Spring需要知道如何连接到数据库,所以需要定义一个`DataSource` bean,这里可以根据实际使用的数据库类型选择相应的实现,如Apache Commons DBCP或Oracle的UDDI。 ```xml ...

    spring+jotm 多数据源事务管理(三)JNDI+Tomcat

    - `commons-cli-1.0.jar`: Apache Commons CLI工具包,用于解析命令行参数。 - `connector-1_5.jar`: 连接器实现库。 #### 二、Tomcat中的JNDI配置 在Tomcat中配置JNDI资源,以便Spring可以使用这些数据源。具体的...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ``` ##### 配置Spring内置数据源 Spring框架自带的数据源: ```xml ``` #### 将数据库连接信息...

    quartz手动测试需要的jar

    6. **commons-pool-1.5.4.jar**:Apache Commons Pool是对象池设计模式的实现,与DBCP一起工作,用于管理数据库连接的池化。 7. **slf4j-api-1.6.0.jar**:Simple Logging Facade for Java (SLF4J) 是一个日志抽象...

    Spring事务配置[收集].pdf

    这需要启用注解驱动的事务管理,例如在配置文件中添加`<tx:annotation-driven transaction-manager="transactionManager"/>`。 4. **编程式事务管理**: 通过`PlatformTransactionManager`接口的实现手动开始、提交...

    Commons DbUtils源码阅读之实例及测试应用

    在需要进行多步骤操作并要求事务一致性的情况下,可以通过`TransactionManager.startTransaction()`开启事务,然后进行操作,最后通过`TransactionManager.commit()`或`TransactionManager.rollback()`来提交或回滚...

    springmvc事务配置到controller.zip

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" ... /> <!-- 配置事务管理器 --> <!-- 启用基于注解的事务管理 --> <tx:annotation-driven transaction-manager=...

    关于SpringMyBatis纯注解事务不能提交的问题分析与解决

    为了解决上述问题,可以考虑更改数据源的实现类,使用更高效的数据源管理方案,如`BasicDataSource`(来自Apache Commons DBCP库)。具体配置如下: ```xml <bean id="dsOracle2" class="org.apache.commons.dbcp....

    spring_如何管理事务的

    ### Spring如何管理事务 #### 一、Spring事务管理...<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <!-- 配置数据源参数 --> <!-- 定义事务管理器 --> <!-- 定义事务拦截器 --> ...

    spring对多个数据库进行事务管理.doc

    对于多个数据库的事务管理,Spring主要依赖于JTA(Java Transaction API)和XAResource接口来实现分布式事务。然而,JTA的XA事务通常在J2EE环境下工作,需要容器支持,比如JBoss、WebLogic等。在J2SE环境中,Spring...

Global site tag (gtag.js) - Google Analytics