spring事务处理相关,整合mybatis的系统如何单独做事务控制
2017-05-22 00:00
441 查看
需求:系统有一个地方需要单独做事务控制,可以使用的方式这里记录一下。
第一种方式:使用 @Transactional 注解
配置文件里面要配置该注解相关:
使用:直接用该注解即可使用
具体的可以参数 https://my.oschina.net/guanzhenxing/blog/214228 的文章。
第二种:在事务切面表达式那里入手
如上的写法,可以配置多个切面表达式
第三种:在spring中注入并且获取session
如上,即可在方法中做事务控制
第四种:spring如果没有生效的情况下使用:
所有的一切,事务都要注意关闭事务
附录:
第一种方式:使用 @Transactional 注解
配置文件里面要配置该注解相关:
<!-- 定义一个数据源 --> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spring_test" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 定义JdbcTemplate的Bean --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"> </bean> <!-- 配置事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"> </bean> <!-- enables scanning for @Transactional annotations --> <tx:annotation-driven transaction-manager="txManager" /> <!-- 在该Bean的代码中标注@Transactional可以被事务管理器注入 --> <bean id="userScore" class="net.hingyi.springDemo.transaction.service.UserScoreServiceImpl" p:userScoreRepository-ref="userScoreRepository_jdbc" /> <bean id="userScoreRepository_jdbc" class="net.hingyi.springDemo.transaction.repository.UserScoreRepositoryImpl" p:jdbcTemplate-ref="jdbcTemplate" />
使用:直接用该注解即可使用
@Transactional public class UserScoreRepositoryImpl { private JdbcTemplate jdbcTemplate; @Override public UserScore getUserSocore(String userNo) { final UserScore us = new UserScore(); ... return us; } ... }
具体的可以参数 https://my.oschina.net/guanzhenxing/blog/214228 的文章。
第二种:在事务切面表达式那里入手
<aop:config> <aop:aspect ref="dynamicDataSourceAspect"> <aop:pointcut id="backMethod" expression="execution(public * com.yundaex..CompleteInboundNoticeBackToQimenDaoImpl.query*(..)) || execution(public * com.yundaex.wms..InventoryCountReportToQimenDaoImpl.query*(..)) || execution(public * com.yundaex.wms..OrderProcessReportToQimenDaoImpl.query*(..)) || execution(public * com.yundaex.wms..OutboundNoticeConfirmBackToQimenDaoImpl.query*(..)) || execution(public * com.yundaex.wms..ReturnOrderBackToQimenDaoImpl.query*(..)) || execution(public * com.yundaex.wms..StockChangeReportToQimenDaoImpl.query*(..)) "/> <aop:around method="aroundMethod" pointcut-ref="backMethod"/> </aop:aspect> </aop:config>
如上的写法,可以配置多个切面表达式
第三种:在spring中注入并且获取session
class A{ @Autowired private SqlSessionFactory sqlSessionFactory; ...... }
SqlSession sqlSession = sqlSessionFactory.openSession();
如上,即可在方法中做事务控制
第四种:spring如果没有生效的情况下使用:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * spring 上下文获取 有时候需要在代码中直接获取spring bean,就可能通过这种方式 */ public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext context; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } /** * 根据bean的name来获取bean * * @param beanName * @return */ public static Object getBean(String beanName) { return context.getBean(beanName); } /** * 获取spring上下文 * * @return */ public static ApplicationContext getContext() { return context; } }
SqlSessionFactory sqlSessionFactory =SpringContextUtil.getContext().getBean(SqlSessionFactory.class); //SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringContextUtil.getBean("sqlSessionFactory"); SqlSession sqlSession = sqlSessionFactory.openSession();//打开事务 try { 。。。。。。。。。。。。。。。。。。。 sqlSession.commit(); } catch (BaseException | Exception e) { e.printStackTrace(); sqlSession.rollback(); //回滚事务 } finally { sqlSession.close(); }
所有的一切,事务都要注意关闭事务
附录:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class RunInsert { /** * @param args */ public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 动态导入数据库的驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取数据库链接 conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbc_teaching", "root", ""); // 开启事务 conn.setAutoCommit( false ); // 创造SQL语句 String sql = "INSERT INTO user_list ( user_name, user_password ) VALUES ( 'Eric', '123' )"; // 执行SQL语句 stmt = conn.createStatement(); stmt.executeUpdate(sql); // 提交事务 conn.commit(); System.out.println( "OK!" ); } catch (Exception e) { e.printStackTrace(); // 回滚事务 try { conn.rollback(); } catch ( Exception e2 ) {} } finally { // 关闭Statement try { stmt.close(); } catch (Exception e) {} // 关闭Connection try { conn.close(); } catch (Exception e) {} } } }
相关文章推荐
- spring整合mybatis是如何配置事务的?
- spring与mybatis整合及事务控制
- java-mybatis、springmvc 整合,使用 @Transactional 时遇到的事务相关问题
- spring与mybatis整合及事务控制
- spring与mybatis整合及事务控制
- spring与mybatis整合及事务控制
- 在ssh2整合中,for循环如何控制事务?在线,急
- SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
- mybatis源码解析(五)-mybatis如何实现的事务控制
- 使用Spring(13)Spring与MyBatis整合(二)DataSourceTransactionManage把事务控制在Service层
- spring与mybatis整合及事务控制
- 如何通过一个毫不相关的进程去控制另一进程窗口中数据
- spring 2.5整合jdbc进行数据库操作和注解事务控制
- 如何系统收集网页/电子书等相关的知识点
- 如何在系统中控制第三方框架的日志输出
- spring 2.5整合jdbc进行数据库操作和XML事务控制
- 【转】Win XP远程登录-如何远程控制电脑(windows系列大体相同)的相关设置
- MM--移动类型的配置相关的系统表,举例说明SAP是如何根据配置抛帐的
- MM--移动类型的配置相关的系统表,举例说明SAP是如何根据配置抛帐的
- 如何控制CE系统的重启或者关机