我以前经常要做这样的事情:
web服务接收上传的文件后,程序做两步动作:
1:将上传文件的文件名,等其它信息存入数据库。
2:将文件存为本地文件。
在这样的一个操作中,如果第一步成功,而第二步失败,那么系统中就会有不一致状态。比如数据库中记录某个文件路径和名称,但是因为第二步失败所以文件系统中并没有指定的文件。
当时我想如果有某种机制把这两个操作组合在一个事务里边(当然我这种情况并非必要,只要数据库操作先不提交,等存文件的工作完成后在提交),如果事务回滚,往文件系统写文件的操作也能撤消,那可就真强了。为了这个问题,今天我特意看了一下jta的资料,本以为jta就是处理此类事情的,其实不然!jta只对自己事务边界内的数据库操作或其它拥有xaresource资源(或者说遵循了xa协议的操作)的操作发生作用。比如用一个事务来组合对几个不同数据库连接的操作这类情况下,jta非常合适。但是比如对我的写文件,或者往socket发送流 等等操作,是否也可以用jta或其它机制来组装成一个事务呢?请大家指教!
web服务接收上传的文件后,程序做两步动作:
1:将上传文件的文件名,等其它信息存入数据库。
2:将文件存为本地文件。
在这样的一个操作中,如果第一步成功,而第二步失败,那么系统中就会有不一致状态。比如数据库中记录某个文件路径和名称,但是因为第二步失败所以文件系统中并没有指定的文件。
当时我想如果有某种机制把这两个操作组合在一个事务里边(当然我这种情况并非必要,只要数据库操作先不提交,等存文件的工作完成后在提交),如果事务回滚,往文件系统写文件的操作也能撤消,那可就真强了。为了这个问题,今天我特意看了一下jta的资料,本以为jta就是处理此类事情的,其实不然!jta只对自己事务边界内的数据库操作或其它拥有xaresource资源(或者说遵循了xa协议的操作)的操作发生作用。比如用一个事务来组合对几个不同数据库连接的操作这类情况下,jta非常合适。但是比如对我的写文件,或者往socket发送流 等等操作,是否也可以用jta或其它机制来组装成一个事务呢?请大家指教!
解决方案 »
- 为何mark方法老报错?
- 客户端调用服务程序发送邮件
- 哪位帮忙翻译成JAVA的代码? 谢谢啊
- 两个对象的值相等的问题
- 使用 request.getRequestDispatcher(url).include(request,response); 可以弹出一个新窗口么!?
- 求救, 我的applet错在哪了(在线等)
- 菜鸟需要帮助
- 怎么样在 .NET 下做一个程序,让这个程序做这样的一件事: 24小时检测公司的防火墙是不是死掉,如果死掉就调用 DEPLHI平台下编译的短信平
- 关于JAVA 的Native调用C++的问题!
- 这个死循环的Exception怎么写?请大家帮忙!!!!!!!!!!
- 关于HashMap的问题,请大家帮助我
- 特殊字符串替换问题
大侠,关于我举的这个例子,我确实可以等到文件操作完成后再提交数据库操作。但是我想,当前java的事务机制中,包括jta,ejb的事务机制,由没有满足我所说的要求的一种呢?再有,你说的 “自己定义事务” 具体指的是怎样?望赐教!
将存入数据库的数据删除;这样你的数据库不就相当于回滚了。
}
1:将上传文件的文件名,等其它信息存入数据库。
2:将文件存为本地文件。
--------------------------------------------
你的逻辑有点问题:如果文件上传成功与否,对于业务而言很重要,那么,这个操作应该是关键操作,
如果该操作没有成功完成,那么,就不应该发生其他相关操作。所以,你应该首先做文件上传的操作,然后判断文件上传是否成功,
如果成功,再做插入数据等操作。这些同一事务的操作,
是可以做统一处理的,
不过,要自己写~
insert database
}else{
不用处理了 因为没上传成功
}好象和事务不是很搭介的一个逻辑
不过好象可以在抛出SQLException后把文件删掉就行了!我有一个类似的问题,如果我在写文件中一行一行地写,而每一行的字符都需要有数据库的支持,而且不止一个statement,那么如果中间出现异常,我前面的字符已经写入文件,而后面的又没有写入不就出现问题了吗?这个怎么做成事务呢?难道也是在异常中把文件直接删除?