Jboss下使用spring配置实现JTA全局事务管理(下)

前言

上一篇初步简单实现事务管理,只是针对单数据源实现,对单数据源内的操作能够回滚。出现多个数据源,且多个数据源的操作出现在同一个service方法中时,不能实现多个数据源操作同时回滚,本篇将介绍简单实现jta全局事务。

JBoss下配置数据源

应用服务器下配置数据源,项目中通过jndi方式引入,这里以jboss为例,配置 standalone.xml ,设置数据源url,username,password,同时设置jndi name。如下:

     
	
		jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
		h2
		
			sa
			sa
		
	
	
		jdbc:mysql://IP1:port1/database1
		MYSQL
		
			EncryptedPassword_**_1
		
	
	
		
			org.h2.jdbcx.JdbcDataSource
		
		
			com.mysql.jdbc.Driver
		
	
	
		 jdbc:mysql://IP2:port2/database2
		MYSQL
		
			EncryptedPassword_**_1
		
	
	
		 jdbc:mysql://IP3:port3/database3
		MYSQL
		
			EncryptedPassword_**_2
		
	
	
		 jdbc:mysql://IP4:port4/database4
		MYSQL
		
			EncryptedPassword_ccwebdb_3
		
	
	
		jdbc:mysql://IP5:port5/database5
		MYSQL
		
			EncryptedPassword_ccw***b_5
		
	
     


配置好多个datasource之后,在spring.xml中引入。如下:

		
		
			
			
				
					java:/jdbc/mgmdb
				
			
			
		  
			
				
				
				
					
						org.hibernate.dialect.MySQLDialect
						org.hibernate.connection.C3P0ConnectionProvider
						
						utf-8
						true
						true
						none
					
				
			
			
				
			
			
				
			
			
				
			
			
			
				
					java:/jdbc/onldb
				
			
			
			
				
				
				
					
						org.hibernate.dialect.MySQLDialect
						org.hibernate.connection.C3P0ConnectionProvider
						
						utf-8
						true
						true
						none
					
				
			
			
				
			
			
				
			
			
				
			
			
			
				
					java:/jdbc/webdb
				
			
			
		   
			
				
				
				
					
						org.hibernate.dialect.MySQLDialect
						org.hibernate.connection.C3P0ConnectionProvider
						
						utf-8
						true
						true
						none
					
				
			
			
				
			
			
				
			
			
				
			
			
			
				
					java:/jdbc/webdbck
				
			
			
			
			
				
				
				
					
						org.hibernate.dialect.MySQLDialect
						org.hibernate.connection.C3P0ConnectionProvider
						
						utf-8
						true
						true
						none
					
				
			
			
				
			
			
				
			
			
				
			

		


如果按上述配置之后,配置tx时,需要如下配置,否则会报错,找不到默认的 tansactionManager, 
    
    
    
    

这样配置之后,发现并没有jta的影子,因为还没有实现全局事务,上述依旧不能多数据源回滚。 需要在bean配置中,添加如下配置:

    

同时,tx配置需要改为:

    
而不需要配置每个数据源的transactionManager。

JAVA代码中测试:

	@Autowired
	private TblCcmgmUsrInfDao userInfoDao;
	@Autowired
	private TblCcmgmMchntDao mchntInfDao;
	@Autowired
	private TblCcmgmRoleFunctionRelatedDao roleFunctionRelatedDao;
	@Autowired
	private TblCloudzdAcpBillInfoDao billDao;
	@Autowired
	private OnlBillInfDao onlBillDao;


	@Override
	public void updateUsrPwd(UserInfoDto dto) {
		TblCcmgmUsrInf usrInf = userInfoDao.get(dto.getUsrIded());
		usrInf.setUsrPwd(dto.getUsrPwd());
		usrInf.setRecUpdTs(new Timestamp(new Date().getTime()));
		usrInf.setRecUpdUsrId(dto.getCurrentUsrId());
		userInfoDao.modify(usrInf);
		logger.info("jta test");
		TblCloudzdAcpBillInfo inf = new TblCloudzdAcpBillInfo();
		inf.setType("q");
		billDao.save(inf);
		TblCconlBillInf billInf = new TblCconlBillInf();
		billInf.setBillDate("4688grsegsr654gserrggggggggggggggggggggggggggggggggggggggg");
		onlBillDao.save(billInf);
	}

最后一个因字段长度超限而插入失败,则前面所有数据操作均回滚。

最后

该实现未经过充分测试,还需要到具体项目中,测试性能等是否有坑。这里只介绍简单的Jboss下,mysql+hibernate+jta的简单实现。网上还有许多其他方式实现,如JTOM, atomikos方式实现的,各种方法没有做过比较及充分测试。自己学习过程的整理,如果有不对之处,请大牛指点。

你可能感兴趣的:(spring)