IBATIS事务处理 - - 博客频道 - CSDN.NET

body
{
font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif;
font-size: 10.5pt;
line-height: 1.5;
}
html, body
{

}
h1 {
font-size:1.5em;
font-weight:bold;
}
h2 {
font-size:1.4em;
font-weight:bold;
}
h3 {
font-size:1.3em;
font-weight:bold;
}
h4 {
font-size:1.2em;
font-weight:bold;
}
h5 {
font-size:1.1em;
font-weight:bold;
}
h6 {
font-size:1.0em;
font-weight:bold;
}
img {
border:0;
max-width: 100%;
}
blockquote {
margin-top:0px;
margin-bottom:0px;
}
table {
border-collapse:collapse;
border:1px solid #bbbbbb;
}
td {
border-collapse:collapse;
border:1px solid #bbbbbb;
}

? ? ? ? iBATIS事务处理是和Dao紧密相联的。?

? ? ? ? 在使用Dao时,如以下代码,先插入新记录,再进行更新:?

? ? ? ? UserDao.insertUser (user); // Starts transaction?

? ? ? ? user.setName("wh");?

? ? ? ? UserDao.updateUser (user); // Starts a new transaction

? ? ? ?因为没有显式地启动事务,iBatis会认为这是两次事务,分别从连接池中取两次Connection。我们所写的Dao子类(继承自com.ibatis.dao.client.template.SqlMapDaoTemplate)的每一个Dao方法已经默认为一个事务(通过动态代理)。这样的事务是隐式事务.

? ? ? ? iBatis是通过DaoManager类来统管Dao子类的事务,

? ? ? ? 众Dao子类由DaoManager产生,如下:

? ? ? ? Reader reader =Resources.getResourceAsReader("dao.xml");?

? ? ? ? DaoManager ?daoManager =DaoManagerBuilder.buildDaoManager(reader);??

? ? ? ? UserDao userDao = (UserDao) daoManager.getDao(UserDao.class);

? ? ? ? UserDao是用户自己定义的接口,获得的其实是在dao.xml中指定的相对应的 SqlMapDao实现类,从而实现了松藕合。在良好的分层设计中,

?

? ? ? ? 但是一般的事务需要放到业务层,因为一个业务需要具有原子性,事务放到Dao层是不能达到业务一致的效果的,那么如果想要把事务放到业务层,就需要在业务层使用显示事务进行声明处理.

?

? ? ? ? 显式地声明事务处理语句,如下:

? ? ? ? try {?

? ? ? ? ? ? ? ? daoManager.startTransaction();?

? ? ? ? ? ? ? ? UserDao.insertUser (user);??

? ? ? ? ? ? ? ? user.setName("wh");?

? ? ? ? ? ? ? ? UserDao.updateUser(user);??

? ? ? ? ? ? ? ? otherDao.doSomething(other);?

? ? ? ? ? ? ? ? ?...?

? ? ? ? ? ? ? ? daoManager.commitTransaction();?

? ? ? ?} finally {?

? ? ? ? ? ? ? ? daoManager.endTransaction();?

? ? ? ?}

? ? ? ?这样就保持了原子性,整体为一个事务,要么全部执行成功,否则回滚。

?

? ? ? ?现在唯一的问题就是,dao层的事务是否已经放弃,否则产生事务嵌套问题对性能会有影响.?

? ? ? ?当然,iBatis 完全可以这么做:建一个声明式接口:IService,再使用动态代理,将用户自己的Serivce子类通过动态代理自动包上事务处理的代码,默认每一个业务方法为一个事务。?

? ? ? ?大师的心如果能轻易揣测,就是不大师了:),估计大师认为这样属于过度设计,他认为把这种灵活性交给用户是合适的,相当多的service 方法只调用一个Dao方法,例如CRUD操作。?

? ? ? ?再补充一下,iBatis中对事务的处理是可配置的,最常用的Type是"JDBC",也可以声明为"JTA"或"EXTERNAL".

?

? ? ? ?项目里常用Spring与Ibatis配合使用,这样可以在Spring里配置事务管理,可以省去业务层的显示事务代码.

? ? ? ? spring的配置文件的基本写法为:

[html] view plaincopyprint?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <beansxmlnsbeansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  3. ???xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"???
  4. ???xmlns:context="http://www.springframework.org/schema/context"???
  5. ???xsi:schemaLocation="????
  6. ??????????http://www.springframework.org/schema/beans?????
  7. ??????????http://www.springframework.org/schema/beans/spring-beans-2.0.xsd??
  8. ??????????http://www.springframework.org/schema/aop?????
  9. ??????????http://www.springframework.org/schema/aop/spring-aop-2.0.xsd????
  10. ??????????http://www.springframework.org/schema/tx?????
  11. ??????????http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">??
  12. ???????????
  13. ???????????
  14. <bean?id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"?>??
  15. ???<property?name="driverClassName"value="com.mysql.jdbc.Driver"?/>??
  16. ???<property?name="url"value="jdbc:mysql://10.11.0.145:3306/carrefour?characterEncoding=gb2312"/>??
  17. ???<property?name="username"?value="dev01"?/>??
  18. ???<property?name="password"?value="123456"/>??
  19. </bean>??
  20. <bean?id="sqlClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">??
  21. ???<property?name="dataSource">??
  22. ??????<ref?local="dataSource"?/>??
  23. ???</property>??
  24. ???<property?name="configLocation">??
  25. ??????<value>classpath:sqlmaps.xml</value>??
  26. ???</property>??
  27. </bean>??
  28. <!--配置事务管理器-->??
  29. <bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
  30. ????????<propertynamepropertyname="dataSource"?ref="dataSource"></property>??
  31. </bean>??
  32. <!--配置哪些方法,什么情况下需要回滚-->??
  33. <tx:advice?id="serviceAdvice"transaction-manager="transactionManager">???
  34. ????<tx:attributes>????
  35. ????????<!--当代理的service层中的方法抛出异常的时候才回滚,必须加rollback-for参数-->??
  36. ????????<tx:methodnametx:methodname="insert*"?propagation="REQUIRED"rollback-for="Throwable"/>??
  37. ????????<tx:methodnametx:methodname="del*"?propagation="REQUIRED"rollback-for="Throwable"/>???
  38. ????????<tx:methodnametx:methodname="update*"?propagation="REQUIRED"rollback-for="Throwable"/>???
  39. ????????<!--除了上面标识的方法,其他方法全是只读方法-->??
  40. ????????<tx:methodnametx:methodname="*"?read-only="true"/>???
  41. ????</tx:attributes>???
  42. </tx:advice>???
  43. <!--?配置哪些类的方法需要进行事务管理?-->???
  44. <aop:config?proxy-target-class="true">???
  45. <aop:pointcut?id="servicePointcut"expression="execution(*?com.wh.service.*.*(..))"/>???
  46. <aop:advisor?pointcut-ref="servicePointcut"advice-ref="serviceAdvice"/>???
  47. </aop:config>??
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource" >
   <property name="driverClassName"value="com.mysql.jdbc.Driver" />
   <property name="url"value="jdbc:mysql://10.11.0.145:3306/carrefour?characterEncoding=gb2312"/>
   <property name="username" value="dev01" />
   <property name="password" value="123456"/>
</bean>
<bean id="sqlClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
   <property name="dataSource">
      <ref local="dataSource" />
   </property>
   <property name="configLocation">
      <value>classpath:sqlmaps.xml</value>
   </property>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <propertyname="dataSource" ref="dataSource"></property>
</bean>
<!--配置哪些方法,什么情况下需要回滚-->
<tx:advice id="serviceAdvice"transaction-manager="transactionManager">
    <tx:attributes>
        <!--当代理的service层中的方法抛出异常的时候才回滚,必须加rollback-for参数-->
        <tx:methodname="insert*" propagation="REQUIRED"rollback-for="Throwable"/>
        <tx:methodname="del*" propagation="REQUIRED"rollback-for="Throwable"/>
        <tx:methodname="update*" propagation="REQUIRED"rollback-for="Throwable"/>
        <!--除了上面标识的方法,其他方法全是只读方法-->
        <tx:methodname="*" read-only="true"/>
    </tx:attributes>
</tx:advice>
<!-- 配置哪些类的方法需要进行事务管理 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="servicePointcut"expression="execution(* com.wh.service.*.*(..))"/>
<aop:advisor pointcut-ref="servicePointcut"advice-ref="serviceAdvice"/>
</aop:config>

? ? ? ? ?这是在spring+Ibatis的情况下, ,通过aop控制需要事务的包和具体方法,将事务控制在service层,来达到事务在业务层提交和回滚.保持业务的原子性.

来自为知笔记(Wiz)

时间: 2024-10-13 11:35:31

IBATIS事务处理 - - 博客频道 - CSDN.NET的相关文章

编辑文章 - 博客频道 - CSDN.NET

早期银行卡通过磁条记录帐号等信息,本身存储容量小,没有计算功能不能加密解密,所以安全性差.交易时必须通过ATM机,POS机等连接到主服务器,进行交易.卡片本身只起记录帐号的作用.这类磁条银行卡使用范围局限银行的签约客户,使用时需要输入密码,刷卡片.对于大额支付,这种方式无疑是必不可少的,但是越来越多的应用是 快速的.频繁的.非接触的.小额的.离线的,比如公交刷卡.餐饮 .水.电.煤.通讯.社保等需求. 校园一卡通属于智能IC卡,设计初期的目标为了方便刷卡消费,提高小额支付的效率,能够大幅减少现金

C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN

C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简介 (1)构造函数           DataTable()   不带参数初始化DataTable 类的新实例.           DataTable(string tableName)  用指

GCC特性之__init修饰解析 - kasalyn的专栏 - 博客频道 - CSDN.NET

, GCC特性之__init修饰解析 - kasalyn的专栏 - 博客频道 - CSDN.NET.MathJax_Hover_Frame {border-radius: .25em; -webkit-border-radius: .25em; -moz-border-radius: .25em; -khtml-border-radius: .25em; box-shadow: 0px 0px 15px #83A; -webkit-box-shadow: 0px 0px 15px #83A; -

最牛B的编码套路 - 呦呦鹿鸣 - 博客频道 - CSDN.NET

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

绿色版Tomcat 启动 + 停止 + 随系统自动启动 - - 博客频道 - CSDN.NET

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

数据库垂直拆分,水平拆分利器,cobar升级版mycat - freewebsys的专栏 - 博客频道 - CSDN.NET

Using Lua/WSAPI with uWSGI - uWSGI 2.0 documentation 数据库垂直拆分,水平拆分利器,cobar升级版mycat - freewebsys的专栏 - 博客频道 - CSDN.NET

SVN版本冲突解决详解 - snwrking的专栏 - 博客频道 - CSDN.NET

版本冲突原因: 假设A.B两个用户都在版本号为100的时候,更新了kingtuns.txt这个文件,A用户在修改完成之后提交kingtuns.txt到服务器,这个时候提交成功,这个时候kingtuns.txt文件的版本号已经变成101了.同时B用户在版本号为100的kingtuns.txt文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的101版本上作的修改,所以导致提交失败. 版本冲突现象: 冲突发生时,subversion会在当前工作目录中保存所有的目标文件版本[上次更新版本.当

SVN服务器搭建--Subversio与TortoiseSVN的配置安装 - 新新 - 博客频道 - CSDN.NET (2)

1.  Subversio和TortoiseSVN 简介 Subversio简介: Subversion是一个自由,开源的版本控制系统,可以随意地免费下载.修改.以及重新发布. 是一个通用系统,可以管理任何类型的文件. 服务器运行方式:独立服务器和借助apache. 存储版本数据方式:一种是在 Berkeley DB 数据库中存放数据.另一种是使用普通文件,采用自定义的格式来储存,称为 FSFS. Tortoisesvn简介: TortoiseSVN 是 Subversion 版本控制系统的一个

Trac常用插件描述! - wang_xf的Study home - 博客频道 - CSDN.NET

Trac常用插件描述! - wang_xf的Study home - 博客频道 - CSDN.NET