关于spring的事务管理(单数据库):纯属猜测。
事务不应该由dao管理,而应该由service管理
最重要的是如下四个类
DataSource :数据库的Connection连接工厂
DataSourceUtils:
参与同一个事务的多个dao实际上应该是共享同一个conn的。
DataSourceUtils.getConnection(dataSource)取得当前ThreadLocal的conn,如果没有从dataSource创建一个。
DataSourceUtils.releaseConnection(conn, dataSource)未必真正关闭连接。
DataSourceTransactionManager
TransactionProxyFactoryBean;拦截具体业务对象方法调用,中间根据DataSourceTransactionManager设置进行事务管理
文笔不行,说不明白,举个例子:
dao1{
method(){
conn= DataSourceUtils.getConnection(dataSource);
...........
DataSourceUtils.releaseConnection(conn, dataSource);
}
}
dao2{
method(){
conn= DataSourceUtils.getConnection(dataSource);
...........
DataSourceUtils.releaseConnection(conn, dataSource);
}
}
service{ method(); }
serviceImp{
method(){
dao1.method();
dao2.method();
}
}
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="service"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="serviceImp" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
分析:
当调用service.method()时,开始TransactionProxyFactoryBean拦截此方法指定当前线程需要事务,然后调用dao1.method(),
调用conn= DataSourceUtils.getConnection(dataSource)
判断当前线程还没有conn则创建一个,因为此时线程需要事务所以conn.setAutoCommit(false),执行数据库作,
然后DataSourceUtils.releaseConnection(conn, dataSource),判断当前线程需要事务所以不真正关闭连接继续,dao1.method()返回。
调用dao2.method(),调用conn= DataSourceUtils.getConnection(dataSource)判断当前线程有一个conn就返回这个conn,(此时dao1.method()和dao2.method()已经共用了这个conn),执行数据库操作,然后DataSourceUtils.releaseConnection(conn, dataSource),判断当前线程需要事务
所以不真正关闭连接继续,dao2.method()返回。service.method()返回,TransactionProxyFactoryBean拦截取得当前线程连接提交事务,关闭清除连接。这样两个dao就参与到了一个事务当中。如果service.method()抛出异常,则TransactionProxyFactoryBean在service.method()返回时拦截取得当前线程连接回滚事务,关闭清除连接。
不知道猜得对不对
转载于:https://www.cnblogs.com/sunwei2012/archive/2010/12/10/1902171.html
关于spring的事务管理(单数据库):纯属猜测。相关推荐
- Spring JDBC-Spring事务管理之数据库事务基础知识
概述 数据库事务的概念 原子性 一致性 隔离性 持久性 数据并发的问题 脏读dirty read 不可重复读unrepeatable read 幻象读 phantom read 幻象读和不可重复度的区 ...
- Spring的事务管理和数据库事务相关知识
1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱. ...
- 使用动态代理简单模拟一下spring的事务管理
按照平时写代码的习惯,我们会定义一个service接口 package com.proxy.test; public interface UserService {public void sayHel ...
- Spring的事务管理1
事务的回顾: 事务:逻辑上的一组操作,组成这组事务的各个单元,要么全部成功,要么全部失败 事务的特性:ACID 原子性(Atomicity):事务不可分割 一致性(Consistency):事务执行前 ...
- Spring的事务管理难点剖析:应用分层的迷惑
2019独角兽企业重金招聘Python工程师标准>>> Web.Service及DAO三层划分就像西方国家的立法.行政.司法三权分立一样被奉为金 科玉律,甚至有的开发人员认为如果要使 ...
- spring教程--事务管理
Spring的事务管理 1.1 事务: 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性: ACID: 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致. 隔离性:一个事 ...
- batch spring 重复执行_一个3年老javaer竟然连Spring的事务管理都不知道,惊呆了
1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 这里我们以取钱的例子来讲解:比如你去ATM ...
- Spring框架-事务管理注意事项
转载自 Spring框架-事务管理注意事项 常见事务问题 事务不起作用 可能是配置不起效,如扫描问题 事务自动提交了(批量操作中) 可能是在没事务的情况下,利用了数据库的隐式提交 事务配置说明 通常情 ...
- Spring的事务管理难点剖析(4):多线程的困惑
2019独角兽企业重金招聘Python工程师标准>>> 由于Spring的事务管理器是通过线程相关的ThreadLocal来保存数据访问基础设施(也即Connection实例),再结 ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述 事务管理对于企业应用来说是至 ...
最新文章
- 吴军 --《硅谷之谜》读书笔记
- cudnn v4安装
- html中radio,checkbox值的获取、赋值、注册事件
- 高性能异步批量ping的golang实现
- 笔记86 | 视频在ACC起来后会跳进度问题分析
- 删除数组中重复的数字
- 拓端tecdat|matlab测量计算信号的相似度
- jquery ztree 设置勾选_JQuery Ztree 树插件配置与应用小结
- 方正飞鸿智能信息平台产品白皮书(二)
- 计算机网络与互联网(三)
- 商丘学院计算机基础,商丘学院
- 有深意的一段字,现在用的QQ签名
- PyTorch-17 使用TorchText进行文本分类
- RNA-seq——快速下载SRA数据、解决fq文件中测序质量全为 ‘?‘ 的问题
- 图像数据增强2_albumentation 标注框同时修改(VOC、YOLO)
- AI人脸检测和人脸识别是一个概念吗?有什么区别?
- delphi7微信支付宝支付单机版前台源码
- 如何在智能手机上安装mysql(安卓系统)
- python音乐同步歌词_使用python扫描本地音乐并下载歌词
- 闵帆教授《论文写作》——心得体会