项目开发-iBatis事务结构

阅读iBatis源码时,对事务相关的代码,没太关注,导致今天项目技术演练时对同事的疑问,解释不清楚。自己都不清楚的东西,怎么可能向别人解释清楚呢?所以,就干脆继续看iBatis源码,完整跟踪事务的处理流程。重新分析代码,发现iBatis原来使用了代理模式,同时理解了iBatis的线程安全的保证机制及事务控制流程。

顶层类图

线程安全的保证

iBatis的SqlMapClient和SqlMapSession有相同的继承关系,而SqlMapClient的实现类则关联了一个SqlMapSession的实现类。这是典型的代理模式,只是SqlMapClientImpl这个代理对象仅仅是做了功能的转发而已。SqlMapClientImpl类使用了ThreadLocal类型的成员变量来存储关联的SqlMapSessionImpl对象。这就是限制了每个线程都只能操作自己记录的SqlMapSessionImpl数据,从而保证了该属性的线程安全。

SqlMapSessionImpl关联一个SessionScope,记录了一次与数据库的连接所有的信息,SqlMapSessionImpl的所有操作都依赖于该属性。因此它也是线程安全的。SqlMapClientImpl实现CRUD操作都是转发当前线程的SqlMapSessionImpl对象的,而且所有SQL执行操作都依赖当前的SessionScope,代码如下:

public Object insert(String id, Object param) throws SQLException {
    return getLocalSqlMapSession().insert(id, param);
  }
  protected SqlMapSessionImpl getLocalSqlMapSession() {
    SqlMapSessionImpl sqlMapSession = (SqlMapSessionImpl) localSqlMapSession.get();
    if (sqlMapSession == null || sqlMapSession.isClosed()) {
      sqlMapSession = new SqlMapSessionImpl(this);
      localSqlMapSession.set(sqlMapSession);
    }
    return sqlMapSession;
  }

事务基础

iBatis的SqlMapClient提供了事务处理方法如下:

事务相关的类图

事务的状态转换图如下:

SqlMapSessionImpl实现TransactionManager事务相关的四个方法,本质上就是操作它关联的SessionScope中有关事务的属性,即Transaction 和TransactionState。例如:startTransaction方法会根据配置的事务管理器,新建一个事务对象,并设置事务状态为STATE_STARTED。其他跟事务有关的处理大多都是根据操作调用JDBC的Connection的对应的事务处理方法。endTransaction方法会根据事务状态,提交或者回滚SQL操作,最后会关闭JDBC语句和数据库连接。

iBatis源码中使用到的Session的含义是与数据库的一次完整的会话过程,从开启到结束,体现在四个事务操作方法中,所有的SQL执行操作,最终都是通过JDBC的Connection完成的。

时间: 2024-10-13 22:58:48

项目开发-iBatis事务结构的相关文章

项目开发-iBatis事务源码之SQL执行

接上篇,在开启事务后,执行SQL语句,整理SQL执行流程如下,以插入为例. SqlMapClientImpl的insert public Object insert(String id, Object param) throws SQLException { return getLocalSqlMapSession().insert(id, param); } SqlMapSessionImpl的insert public Object insert(String id, Object para

项目开发-iBatis事务源码之事务提交和回滚

接上篇继续事务的提交和结束流程如下. commitTransaction SqlMapClientImpl的commitTransaction操作,类似startTransaction,是最终由SqlMapExecutorDelege的commitTransaction完成的. /** * Commit the transaction on a session * * @param sessionScope - the session * @throws SQLException - if th

项目开发-iBatis源码阅读

近日工作内容是技术调研,研究iBatis使用方法及源码,源码阅读中总是能看到很多设计模式的影子,整理下来,获益匪浅. ibatis client包结构 设计原则学习 1)  接口定义:上图中顶层接口定义的功能职责单一,聚在一个接口中,共同支撑一个功能. 2)  好莱坞原则:SqlMapClient的实现类,是顶层调用者,SqlMapExecutorDelegate类是底层的工作者,提供基本的功能,供上层调用. 3)  面向接口编程原则:SessionScope依赖的是抽象接口SqlMapClie

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX

第十一章 企业项目开发--消息队列activemq

注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC的一种手段. 1.消息队列的基本使用流程 假设: 我们有这样一个需求,当每注册一个admin的之后,就写一条日志log数据到数据库. 分析: 在实际中,我们是不会把日志直接写入数据库的,因为日志数据通常是庞大的,而且日志的产生是频繁的,如果我们使用数据库存储日志,哪怕是使用异步存储,也是极耗性能的.

思考项目开发1

软件工程—思考项目开发那些事(一) 阅读目录: 1.背景 2.项目管理,质量.度量.进度 3.软件开发是一种设计活动而不是建筑活动 4.快速开发(简单的系统结构与复杂的业务模型) 5.技术人员的业务理解与产品经理的业务理解的最终业务模型 5.1.产品的业务理解(业务流程.数据流程及场景) 5.2.技术人员的业务理解(领域模型.设计模型.抽象建模) 6.技术债务(腐烂的遗留代码) 7.软件项目管理与软件工程的鸿沟(项目管理得有语境上下文) 7.1.软件项目管理其实应该多去重视一些技术层面的管理 7

机房收费系统(二)项目开发计划

项目开发计划 1引言 1.1编写目的 主要对开发机房收费系统的费用.时间.进度.人员组织.硬件设备的配置.开发环境和执行环境的配置进行说明.为开发的下一步做准备.预期读者是系统分析员和开发者. 1.2背景 A.待开发软件名称:机房收费系统 B.项目提出者:米新江教授 开发人员:周家林 用户:廊坊师范学院全体教职工 实现该软件的计算机中心或计算机网路:廊坊师范学院局域网 C.该软件为廊坊师范学院信息技术提高班提供技术支持. 1.3定义 SQL SEVER:系统server所使用的数据库关系系统(D

嵌入式linux 项目开发(一)——SQLite数据库

嵌入式linux 项目开发(一)--SQLite数据库 一.SQLite数据库简介 SQLite是一个开源的嵌入式关系数据库,是一种轻量级的.自给自足的.无服务器的.无需配置的.事务性的SQL数据库引擎,其特点是高度便携.使用方便.结构紧凑.高效.可靠,体积小,支持 ACID(原子性.一致性.独立性及持久性Atomicity.Consistency.Isolation.Durability)事物. SQLite官网:http://www.sqlite.org/ SQLite数据库采用模块化设计,

商城项目开发(一)

一.功能的演示 1.用户模块 用户注册功能 发送邮件 激活用户 表单的校验 用户的登录功能 自动登录 用户的注销功能 2.商品模块 首页热门商品和最新商品功能 商品分类 商品的列表(分页) 商品详细信息 浏览记录功能 3.购物车模块 将商品加入购物车 展示购物车功能 4.订单模块(多表和事务) 提交订单 展示订单 在线支付 5.后台的分类的模块 分类信息的增删改查 6.后台的商品模块 商品的信息的增删改查(文件上传) 7.后台的订单的模块 所有的订单的信息展示 二.一般项目开发流程(公司之间是有