由于对Java中的事物管理的概念(本地事物和jta事物)不是很清楚,Google好多文章都是很抽象,希望在论坛中大家提供点比较实际的程序代码案例和必须使用jta事物的场景;好啦,下面给个具体的代码(mybatis,spring),做下说明,我使用两个数据源,两个sqlSessionFactory,两个事物管理器,分别用于两种方式(mybatis的MappBean和MappXML)操作数据库。
spring配置如下:
<bean id="dataSource1" class="com.jolbox.bonecp.BoneCPDataSource"> <constructor-arg index="0" ref="dbConfig1"/> </bean> <bean id="dataSource2" class="com.jolbox.bonecp.BoneCPDataSource"> <constructor-arg index="0" ref="dbConfig2"/> </bean> <!-- <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /> --> <bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath*:edu/silence/mybatis/dao/**/*.xml" /> <property name="dataSource" ref="dataSource1" /> </bean> <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- <property name="mapperLocations" value="classpath*:edu/silence/mybatis/dao/**/*.xml" /> --> <property name="dataSource" ref="dataSource2" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory1" /> </bean> <bean id="userDAO" class="edu.silence.mybatis.dao.impl.userDAO"> <property name="sqlSessionTemplate" ref="sqlSession"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource1" /> </bean> <bean id="springTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource2" /> </bean> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="edu.silence.mybatis.dao.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory2" /> </bean> <bean id="userService" class="edu.silence.mybatis.service.impl.UserService"> <property name="userMapper" ref="userMapper"/> <property name="userDAO" ref="userDAO"/> </bean> <tx:advice id="txAdvice" transaction-manager="springTransactionManager"> <tx:attributes> <tx:method name="find*" propagation="REQUIRED" read-only="true"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <tx:advice id="txAdvice1" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="find*" propagation="REQUIRED" read-only="true"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* *..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> <aop:advisor advice-ref="txAdvice1" pointcut-ref="interceptorPointCuts" /> </aop:config>
dao代码如下:
public class userDAO implements IUserDAO { private SqlSessionTemplate sqlSessionTemplate; public SqlSessionTemplate getSqlSessionTemplate() { return sqlSessionTemplate; } public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } @Override public User findUser(String uid) { return (User) sqlSessionTemplate.selectOne("edu.silence.mybatis.dao.UserMapper.selectByPrimaryKey", uid); } @Override public int saveUser(User user) { boolean flag = true; if(flag){ throw new RuntimeException("事物回滚......"); } return sqlSessionTemplate.insert("edu.silence.mybatis.dao.UserMapper.insertSelective", user); } }
业务层代码如下:
private UserMapper userMapper; private IUserDAO userDAO; public UserMapper getUserMapper() { return userMapper; } public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } public IUserDAO getUserDAO() { return userDAO; } public void setUserDAO(IUserDAO userDAO) { this.userDAO = userDAO; } @Override public User findUser(String uid) { // TODO Auto-generated method stub return null; } @Override public int saveUser(User user) { user.setUid(UUID.randomUUID().toString()); int i = userMapper.insert(user); user.setAlias("就是我"); user.setUid(UUID.randomUUID().toString()); int j = userDAO.saveUser(user); if(i!=1 && j!=1){ throw new RuntimeException("事物回滚......"); } return i+j; } 测试代码如下:
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:**/*application*.xml"); IUserService service = ctx.getBean("userService", IUserService.class); User user = new User(); user.setAlias("Silence"); user.setBirthday(new Date()); user.setEmail("silence@email.com"); user.setGender(1); user.setMobile("18674970916"); user.setPassword("silence"); user.setPhoto("head.jpg"); user.setRealname("china"); user.setRole(1); user.setStudystep(1); user.setUsername("silence"); service.saveUser(user); }
上面使用本地事物,都能正常保存,如果失败都可以同时回滚,所以不明白jta到里在那个具体场景必须使用;也请各位讲解下上面代码在事物性方面有那些问题。
在下先O(∩_∩)O谢谢!!! |
|
来自: 昵称7905119 > 《java技术文章》