事务

一个使用 MyBatis-spring 的主要原因是它允许MyBatis 参与到 Spring 的事务管理中。而 不是给 MyBatis 创建一个新的特定的事务管理器,MyBatis-Spring 利用了存在于Spring 中的 DataSourceTransactionManager。

一旦 Spring 的PlatformTransactionManager 配置好了,你可以在 Spring 中以你通常的做 法来配置事务。@Transactional 注解和AOP(Aspect-Oriented Program,面向切面编程,译 者注)样式的配置都是支持的。在事务处理期间,一个单独的 SqlSession对象将会被创建 和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。

一旦事务创建之后,MyBatis-Spring将会透明的管理事务。在你的 DAO 类中就不需要额 外的代码了。

标准配置

要 开 启 Spring 的 事 务 处 理 , 在 Spring 的 XML 配 置 文 件中 简 单 创 建 一 个 DataSourceTransactionManager 对象:

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/>
</bean>

指定的 DataSource 一般可以是你使用 Spring 的任意 JDBCDataSource。这包含了连接 池和通过 JNDI 查找获得的 DataSource。

要注意, 为事务管理器指定的 DataSource 必须和用来创建SqlSessionFactoryBean 的 是同一个数据源,否则事务管理器就无法工作了。

容器管理事务

如果你正使用一个 JEE 容器而且想让 Spring参与到容器管理事务(Container managedtransactions,CMT,译者注)中,那么 Spring 应该使用 JtaTransactionManager 或它的容器指定的子类来配置。做这件事情的最方便的方式是用 Spring 的事务命名空间:

<tx:jta-transaction-manager/>

在这种配置中,MyBatis 将会和其它由 CMT 配置的 Spring事务资源一样。Spring 会自动 使用任意存在的容器事务,在上面附加一个 SqlSession。如果没有开始事务,或者需要基 于事务配置,Spring会开启一个新的容器管理事务。

注 意 , 如 果 你 想 使 用 CMT , 而 不 想 使 用 Spring 的 事 务管 理 , 你 就 必 须 配 置 SqlSessionFactoryBean 来使用基本的 MyBatis 的ManagedTransactionFactory 而不是其 它任意的 Spring 事务管理器:

<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="transactionFactory"><beanclass="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/></property>
</bean>

编程式事务管理

MyBatis 的 SqlSession 提供指定的方法来处理编程式的事务。 但是当使用MyBatis-Spring 时, bean 将会使用 Spring 管理的 SqlSession 或映射器来注入。 那就是说 Spring 通常是处理事务的。

你 不 能 在 Spring 管 理 的 SqlSession 上 调 用SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 这 样做 了 , 就 会 抛 出 UnsupportedOperationException 异常。注意在使用注入的映射器时不能访问那些方法。

无论 JDBC 连接是否设置为自动提交, SqlSession 数据方法的执行或在Spring 事务之外 任意调用映射器方法都将会自动被提交。

如果你想编程式地控制事务,请参考 Spring 手册的 10.6 节。这段代码展示了如何手动使用在 10.6.2 章节描述的 PlatformTransactionManager 来处理事务。

DefaultTransactionDefinitiondef=newDefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status= txManager.getTransaction(def);
try{userMapper.insertUser(user);
}
catch(MyException ex){txManager.rollback(status);throwex;
}
txManager.commit(status);

注意这段代码展示了一个映射器,但它也能和 SqlSession 一起使用。

Spring事务配置实例相关推荐

  1. Spring事务配置的五种方式 说明

    Spring事务配置的五种方式  [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...

  2. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  3. 6、Spring事务配置上篇

    一.事务简介 1.概述 1.事务在逻辑上一组操作,要么都执行(成功),要么都不执行(失败),主要是针对数据库而言的,比如MySQL.Oracle等. 2.事务是数据库提供的特性,因此可以直接通过操作数 ...

  4. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了具体总结.在此之间对Spring的事务配置仅仅是停留在听说的阶段,总结一下.总体把控.通过这次的学习发觉Spring的事务配置仅仅要把 ...

  5. spring事务配置

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识. ...

  6. spring事务配置,声明式事务管理和基于@Transactional注解的使用

    事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...

  7. Spring 事务配置5种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  8. 7、Spring事务配置下篇

    一.事务细节-七种传播行为 1.概述 1.事务的传播行为是Spring的特性,它指的是多个事务方法之间相互调用时,事务如何在这些方法之间的传播.比如一个事务方法里面调用了另外一个事务方法,那么两个方法 ...

  9. Spring事务配置方式(一) 拦截器方式配置

    一.使用<tx:advice>和<aop:config>配置事务 <!-- 配置事务管理器 --><bean id="transactionMana ...

最新文章

  1. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)
  2. mac os 10.14.5 update failure
  3. 关于AVR单片机熔丝位的设置和拯救方法大全 AVR单片机熔丝位的设置和详细的拯救方法...
  4. Linux系统下ifconfig命令使用及结果分析
  5. form表单获取input对象浏览器区别
  6. IOS动态库打包导入工程报错Library not loaded: @rpath/SwiftFrame.framework/SwiftFrame
  7. HDOJ 1875 HDU 1875 畅通工程再续 ACM 1875 IN HDU
  8. oppoJava面试题,java声明全局变量的关键字
  9. 【Oracle】Python 连接Oracle 数据库
  10. 前端学习(1437):vue一些链接
  11. SVN使用过程中遇到的一些问题
  12. 通过数据扩充来扩展数据集
  13. 找回VisualStudio异常设置中丢失的“用户未处理的(User-unhandled)”列
  14. Python 之 变量进阶(理解)
  15. Python基础与大数据应用(三)
  16. python绘制中国地图(模仿中央气象台)
  17. 利用C语言实现99乘法表两种方式
  18. 《辩证行为疗法》精华部分 + 我的理解
  19. Centos7 ping 不通百度 可能是网络配置问题
  20. 在PyCharm中导入和使用arcpy

热门文章

  1. 华为交换机默认vlan都是通的吗_【思唯网络学院】华为交换机常用的三种vlan划分方法...
  2. arduino 停止程序_建立Arduino机器人,第五部分:障碍规避
  3. web浏览器_Web上的分享(Share)API
  4. MySQL数据库是非关系_MySQL(数据库)基础知识、关系型数据库yu非关系型数据库、连接认证...
  5. java treemap_Java TreeMap lastEntry()方法与示例
  6. mysql 中有行号吗_重置SQLite3 / MySQL中的行号计数
  7. python if语句 for语句 while语句
  8. Java Formatter toString()方法与示例
  9. 小心Lombok用法中的坑
  10. 两难!先更新数据库再删缓存?还是先删缓存再更新数据库?