有关于事务

08-10-27 bloodrate
事务分为两类
1,本地事务,单一数据源操作
2,分布是事务JTA,多个数据源操作

但是我发现很多情况下事务靠JTA仍然不足以解决,JTA限制
1、由容器管理所有数据源连接
2、容器毕竟有限,管理的连接类型种类也不会太多
倘若如下情况
1、用户没有通过JNDI,而是在代码里用JDBC手动创建2个CONN,从一个里删除数据,插入到另一个里
2、倘若数据源类型非容器支持类型,比如将本地文件插入到数据库,那么操作的两个数据源一个是FileInputStream,另一个是Connection。

这两种情况下的事务如何解决?

banq
2008-10-27 13:23
从道理上说:需要自己写锁和回滚方式来完成,JTA是JavaEE重要的一个技术标准,事务和同步锁非常复杂和难写,特别是并发多线程情况下,这方面没有必要重复发明轮子。使用容器也就是服务器提供的JTA标准组件,就可以,Spring虽然号称自己提供事务,其实只是提供事务使用方式,也就是JTA的使用方式。

所以,一般情况下,向JTA这个事务努力。文件混入JTA事务也比较简单,只要在回滚方法中时插去文件即可。或者使用文件锁。

bloodrate
2008-10-27 14:18
或者另一种情况更复杂: 数据源为另一个程序员开发的远程应用程序,获得操作远程数的API也是别人开发的,很难混入JTA那些标准数据源类型一同使用.

banq
2008-10-27 14:28
>数据源为另一个程序员开发的远程应用程序
使用JMS,实现分布式事务,而且可以松耦合,远方程序只要在一个事务中将消息对象放入一个queue中,而这里就是要一个MDB带事务的消息消费者读取,在一个事务中读取,如果读取后处理任何一个环节出错,消息对象不会从queue中消失,以便MDB再次重复,这样,整个过程看就是一个事务。