`
AreYouOK?
  • 浏览: 56666 次
  • 性别: 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(){
  回滚
}

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

相关推荐

    Jakarta commons docs API CHM 格式

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

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

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

    最新Hibernate jar 架包(9个)

    commons-collections-3.2.jar Apache Commons包中的一个, 包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包 javassist-3.12.0.GA.jar 这个包也是必须的 jta.jar 当使用JTA规范时,必须加入,...

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    Apache commons-io Apache基金会创建并维护的Java函数库 Apache commons-logging 通用的日志接口 dom4j 优秀的JavaXML API 主要用于解析XML文档 poi组件 主要用于读取以及写入Microsoft Office格式档案 JSR 303 为...

    iBATIS实战

    3.3.2 Jakarta Commons数据库连接池 49 3.3.3 分布式高速缓存 49 3.4 将iBATIS添加到应用程序中 49 3.4.1 在独立应用程序中使用iBATIS 50 3.4.2 在Web应用程序中使用iBATIS 50 3.5 iBATIS和JDBC 51 3.5.1 释放JDBC...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

    13. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap 14. commons-collections-3.1.jar 15. 16. //这个似乎可以不用的 ...

    jedis使用指南

    import org.apache.commons.pool.impl.GenericObjectPool.Config; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Transaction; /** * @author Teaey */ ...

    ssh框架在application.xml中配置数据源所需jar

    class="org.apache.commons.dbcp.BasicDataSource"> value="${database.driver}"> ${database.url}"> ${database.username}"> ${database.password}"> class="org.springframework.orm....

    Activiti6.0教程例子下载

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    spring3.2+strut2+hibernate4

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driverClassName}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- ...

    springmvc-ibatis

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...

    springmvcmybatis

    -- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> ...

    SpringMVC+Hibernate全注解整合

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...

    SpringMVC-SSH全注解

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} ... {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{chapter.16} {16.1}HTML}{215}{section.16.1} {...

Global site tag (gtag.js) - Google Analytics