mybatis 事务相关问题

问题描述

使用了mybatis后,比如有相关的增删改,这些都是与事务相关的,但是使用mybatis,就是一个接口,接口对应的配置文件,service再去调用这个接口,增删改都是与事务有关,怎么体现事务呢?我觉得我在写程序的过程中好像没有用到事务, 求解

解决方案

一般使用Mybaits也就这么几种情况。 (1)单独使用Mybatis不与Spring集成,那么应该这么使用,最原始的方式。 //这里要传false 手动事务SqlSession session = sqlSessionFactory.openSession(false);try {//插入A表 //修改B表session.commit();} catch (Exception e) {session.rollback();} finally {session.close();}(2)与Spring集成使用,但是没有将事务托管给Spring,一般都是使用SqlSessionTemplate这个类,这种情况在Mybatis执行增删改查以后Mybatis会自动提交事务,关闭session。 private class SqlSessionInterceptor implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { final SqlSession sqlSession = getSqlSession( SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator); try { Object result = method.invoke(sqlSession, args); if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) { // force commit even on non-dirty sessions because some databases require // a commit/rollback before calling close() sqlSession.commit(true); } return result; } catch (Throwable t) { Throwable unwrapped = unwrapThrowable(t); if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) { Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException) unwrapped); if (translated != null) { unwrapped = translated; } } throw unwrapped; } finally { closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory); } } }(3)与Spring集成使用,并且使用了Spring的事物上下文,那么事物会由Spring管理,这与hibernate与Spring集成的事物没有区别,Spring会管理事物。
解决方案二:
一般使用Mybaits也就这么几种情况。(1)单独使用Mybatis不与Spring集成,那么应该这么使用,最原始的方式。//注意这里获取session的时候要传参数 false 需要手动事务的意思.SqlSession session = sqlSessionFactory.openSession(false);try {//插入A表 //修改B表session.commit();} catch (Exception e) {session.rollback();} finally {session.close();}
解决方案三:
1.首先要看你的spring 配置文件里面,有没有配置事务管理方式比如<!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>这种对整个service或者dao自动aop方式加入事务,或者具体的某个以insert*,update*,delete*等开头的方法配置事务2.在需要加事务的地方通过注解配置@Transactionalpublic void saveUser(..)类似这样的注解的现在事务配置更倾向于非侵入式的。

时间: 2024-10-23 19:03:27

mybatis 事务相关问题的相关文章

捕获-springMVC+spring+mybatis事务问题

问题描述 springMVC+spring+mybatis事务问题 有什么办法能正常处理捕获异常并进行回滚,并且将具体的错误信息return. 而一旦出现异常后,就不会执行return了! 请问有什么办法吗? 解决方案 参考:http://bbs.csdn.net/topics/390785374

spring+mybatis事务不生效,求解

问题描述 spring+mybatis事务不生效,求解 首先是applicationContext.xml文件 <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.Dat

spring mybatis 事务范围

问题描述 spring mybatis 事务范围 5C 平常spring+mybatis配置中 ,只配置了 class=""org.springframework.jdbc.datasource.DataSourceTransactionManager""> ,没有编码实现和声明实现, 那么一个请求中多个多数据库的操作, 在这个请求中有事务吗,如果有事务范围是这个请求 ,还是每个dao操作都是一个事务? 另 数据库 配置 | Variable_name | V

springmvc 事务-springmvc+mybatis 事务该怎么配置,请大神详细解答 谢啦

问题描述 springmvc+mybatis 事务该怎么配置,请大神详细解答 谢啦 我搭建的是maven项目 用springmvc框架 数据库用mybatis管理 ,现在要用到事务了,该怎么配置呢,求大神讲解,每个配置文件该怎么写,还有什么地方该注解什么,详细的说清楚,谢啦 解决方案 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" > <property

spring mybatis 事务隔离级别

问题描述 spring mybatis 事务隔离级别 我数据库的主键是单独存放在一张公共表里面的,里面的数据如下: 表名|当前值 table1|20 然后通过一个存储过程来每次获取递增. 我配置的是service级别的事务.我在一个service里面把要插入的数据封装到List里面,多次调用自增长主键存储过程,发发现每次获取的都是相同的值.按理说我每次调用数据库里面的值就会从20变成21,依次类推.是不是默认的事务隔离级别是不提交我的事务.等全部执行成功之后才提交事务? 我应该配置成什么隔离级别

spring事务 异常-spring+hibernate注解开发异常,事务相关

问题描述 spring+hibernate注解开发异常,事务相关 异常信息: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from tr

事务管理-hibernate和mybatis事务问题

问题描述 hibernate和mybatis事务问题 我想在web应用中使用hibernate和mybatis配合做数据持久化,但是遇到数据源和 事务的问题.首先hibernate是使用的proxool连接池,在自己写的hibernate工具 类中加载hibernate的sessionFactory以及session的打开和事务管理等.那么问题 来了,我在mybatis中该如何配置来使用连接池,以及和hibernate使用同一个事务. 请大神支招. 解决方案 spring集成mybatis事务问

spring mvc+mybatis 事务控制不起作用

问题描述 用的是spring mvc和mybatis框架.数据库是mysql.然后发现事务配置了不起作用..业务逻辑是新增用户,用户新增成功之后再在其他表插入一条对应的用户角色关联信息.现在问题是假如用户插入成功之后..插入对应的用户角色关联信息出错后,用户那条新增记录不能自动删除.看了很多人说是因为@service提前扫描的问题.那个我改过了.还有说是表的引擎不是InnoDB.但是我们建的表是InnoDB.还有说要抛出RuntimeException.我也抛出了..但是还是没用.没办法.请大家

事务相关报错记录

配置文件加上下面这段就好了