说到事务,无非就是事务的提交commit和回滚rollback。

事务是一个操作序列,这些操作要么全部都执行成功,事务去提交,要么就是有一个操作失败,事务去回滚。

要知道事务的4大特性ACID.即原子,一致,隔离,持久。

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中的诸多操作,要么都做,要么都不做。

一致性(consistency):事务必须使数据库从一个一致性状态,转变为另一个一致性状态。一致性和原子性是密切相关的。

隔离性:(isolation)一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务不能互相干扰。

持久性(durability):持续性也称永久性,指一个事务一旦提交,他对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对齐有任何影响。


手动设置事务

try{
开启事务
操作1--》db操作
操作2--》db操作
操作3--》db操作
提交事务
}catch{
回滚事务
}


下面用ssm框架来管理事务


1首先配置事务管理器


关键类是DataSourceTransactionManager。

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>(表示管理哪个数据源的事务)

</bean>


2声明事务的特性、规则(注解方式不用配置事务特性)


<!--通过<tx:advice>标签定义事务增强,并制定事务管理器 -->

<tx:advice id="txAdvice" transaction-manager="txManager">(给带有create前缀的方法规定事务特性)

<!--定义属性,声明事务规则 -->

<tx:attributes>

<tx:method name="create*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/>

</tx:attributes>

</tx:advice>


 

分析下事务的propagation传播方式

分析下事务的isolation

隔离性
对相同的数据进行读写时,事务并发会发生错误数据处理,会产生脏读、幻读,不可重复读等错误,这些可以通过设置事务的隔离级别来解决
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据时无效的
不可重复读:在同一事务中,多次读取同一数据返回的结果不同,换句话说,后续读取可以读到另一事务已提交的更新数据,这样就会出现两次读取数据不一样(如事务t1读取某一数据,事务t2读取并修改了该数据,t1为了读取值惊醒校验而在此读取改数据,得到了不同的结果)
可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是后续读取不能读到另一事务已经提交更新的数据
幻读:一个事务读取了几行记录后,另一事务插入一些记录,幻读就发生了,再后来的查询中,第一个事务就会发现原来没有的记录

隔离级别(isolation):
1、读未提交 READ_UNCOMMITTED 还未提交就能查看(read_uncommitted)
2、读已提交 READ_COMMITTED 这个级别会把查看,增删改隔离开来,未提交的增删改不能查看(read_committed)
3、可重复读REPEATABLE_READ(read)
4、序列化操作SERIALIZABLE 事务间对同一数据互斥,必须等第一个事物完成之后,第二个事务才可以操作(serializable)
默认值 DEFAULT(oracle 默认值是第二个,mysql是第三个)(default)
隔离级别由低到高的顺序 READ_UNCOMMITTED -->READ_COMMITTED-->REPEATABLE_READ-->SERIALIZABLE级别越高安全性越高,并发处理能力越低

分析下事务的rollback-for

是事务回滚方式一般异常时回滚Exception


3配置事务


3.1使用注解来配置


<!-- 开启事务注解,标注@Transactional的类和方法将具有事务性 -->

<tx:annotation-driven transaction-manager="txManager" />(使用哪个事务管理器来配置事务)

注解的用法,必须为public方法才行,不要捕捉异常,要让异常自动抛出,否则不能进行事务回滚。方法要写在服务层中在controller中无效。

@Transactional(isolation=isolation.READ_COMMITED)
public void f3(){
处理1
处理2
}


3.2使用标签来配置(注解方式不用配置事务特性)


<!-- 在切面中插入事务 -->

<aop:config proxy-target-class="true">

事务代理(代理归属权)
创建的sqlsesstion用什么接收的问题?
proxy-target-class=false
jdk的代理(只能用impl,不能用接口)
proxy-target-class=true
spring的代理(可以用接口了)

<aop:pointcut id="serviceMethod" expression="execution(* com.lyt.soa.service..*.*(..))"/>(在哪些切点中加入事务)

<!-- 将事务增强与切入点组合(织入事务切面) -->

<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>(织入事务并规定了事务特性)

</aop:config>


spring的事务处理的更多相关文章

  1. 【Spring】Spring系列5之Spring支持事务处理

    5.Spring支持事务处理 5.1.事务准备 以上代码结构与AOP的前置通知.返回通知.异常通知.后置通知一样. 5.2.声明式事务 5.2.1.基于注解 5.2.2.基于配置文件 5. 3.事务传 ...

  2. Spring Batch事务处理

    事务模型描述 1.step之间事务独立 2.step划分成多个chunk执行,chunk事务彼此独立,互不影响:chunk开始开启一个事务,正常结束提交.chunk表示给定数量的item的操作集合,主 ...

  3. Spring框架——事务处理(编程式和声明式)

     一. 事务概述 ●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术. ●事务就是一组由于逻辑上紧密关联而合 ...

  4. 【Spring】Spring之事务处理

    编程式事务 /** * 1. 根据DataSource去创建事务管理器 * 构造方法 , 参数1. DataSource */ DataSourceTransactionManager txManag ...

  5. 踩坑系列《六》Spring增加事务处理遇到异常解决办法

    当在对数据进行增删改操作时,需要用到事务的处理,所以在业务层中加入@Transactional注解,但是在执行业务操作的前面遇到异常,因此对异常进行抛出,但是数据又诡异地成功保存到数据库了. 解决方法 ...

  6. hibernate整合进spring后的事务处理

    单独使用hibernate处理事务 本来只用hibernate开发,从而可以省了DAO层实现数据库访问和跨数据库,也可以对代码进行更好的封装,当我们web中单独使用hibernate时,我们需要单独的 ...

  7. java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate

    java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate等. ...

  8. Idea SpringMVC+Spring+MyBatis+Maven调整【转】

    Idea SpringMVC+Spring+MyBatis+Maven整合   创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetyp ...

  9. SpringMVC+Spring+MyBatis+Maven调整【转】

    Idea SpringMVC+Spring+MyBatis+Maven整合   创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetyp ...

随机推荐

  1. Tomcat部分操作

    一 概述 1.Tomcat是什么? Tomcat是Apache软件基金会提供的开源免费的服务器,适用于中小型系统与并发访问用户不是很多的情况. 2.域名 IP是互联网上一台计算机的唯一标识,但IP不容 ...

  2. OPENCV VS设置

    OPENCV VS设置 第一步 工程->工具->选项->VC++目录 第二步 这两项放到系统path下 D:\OpenCV2.4.3\VS\bin\Debug;D:\OpenCV2. ...

  3. Android SDK 目录和作用详解

    1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面.也可以是厂商自己制作的add-ons.开发中该文件是可选的,如果你没有用到 ...

  4. hibernate基础配置

    数据库表名和类名 一致 注解:可写可不写: XML:可写可不写: <class name="Student"> 不一致 注解:  public class Teache ...

  5. Select selectedIndex 属性

    定义和用法 selectedIndex 属性可设置或返回下拉列表中被选选项的索引号. 注意: 若允许多重选择,则仅会返回第一个被选选项的索引号. 语法 设置 selectedIndex 属性: sel ...

  6. dedecms 模板文件不存在 无法解析文档!问题定位方法!

    生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...

  7. FPGA----只读存储器(ROM)

            ROM是一种重要的时序逻辑存储电路,它的逻辑功能是在地址信号的选择下,从指定存储单元中读取相应的数据.R0M只能进行数据的读取,而不能修改或写人新的数据,本节将以16×8的ROM为例, ...

  8. 如何通过一个SAPGUI屏幕反查这个屏幕对应的事务码

    假设我通过某种跳转方式打开了下图这个SAPGUI的屏幕,但我想搞清楚用哪一个事务码可以直接到达这个屏幕,而不通过繁琐的点击,应该怎么做? 步骤1,点击Order字段,按F1打开帮助界面, 点上图的图标 ...

  9. Jmeter入门14 后置处理器JSON Extractor 提取json的多个值

    json串 []表示对象组成的数组,{}表示对象. 对象里包含多个 "属性":属性值.属性值可以是值,或数组,或对象. JSON Extractor使用json path表达式匹配 ...

  10. python解析HTML之:PyQuery库的介绍与使用

    本篇大部分转载于https://www.jianshu.com/p/c07f7cd1b548 先放自已自己解析techweb一个网站图片的代码 from pyquery import PyQuery ...