事务一般是指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么完全执行,要么完全不执行。事务就是判断以结果为导向的标准。

一.spring的特性(ACID)

(1).原子性(atomicity)
       原子性就是一个不可分割的工作单元。简单的说,就是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果失败则不能对数据库有任何影响。
    (2).一致性(consistency)
     一致性就是事务必须是使一个一致性状态变成另一个状态,也就是说一个书屋执行之前和执行之后都必须处于一致性状态。那转账来说,假设用户A和用户B两者的钱加起来一共是5000.那么不管A和B之间如何转账,转多少次,事务结束后两者的钱加起来还是5000。
    (3).隔离性(isolation)
     隔离性就是一个事务的执行不能被另一个事务干扰。当多个用户并发访问数据库操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,并发事务之间要相互隔离。
  (4).持久性(durability)
      持久性是指一个事务一旦被提交了,那么对数据库数据的改变就是永久的。即使是在数据系统遇到故障的情况下也不会丢失提交事务的操作。

二.spring的隔离级别

* 脏读:一个事务读到了另一个事务未提交的数据
* 不可重复读:一个事务读到另一个事务已经提交(update)的数据导致多次查询结果不一致
* 虚幻读:一个事务读到了另一个事务已经提交(insert)的数据导致多次查询结果不一致。

对于sqlserver和oracle的默认隔离级别是RC,mysql的默认隔离级别是RR。

三.spring的传播特性(事务有7中传播机制 )

对于spring的代码我有写过一个测试的小demo,在demo里面有记录如何添加的事务,同时也打印了日志记录最后结果,可以任意扩展。

由于博客园上传代码比较麻烦,我就上传到CSDN上的,想测试的可以去下载。

网址:https://download.csdn.net/download/zj520_/12064006

四.spring的注意事项

1. 出现Exception是无法回滚的,只有抛出RuntimeException和Error异常时才能回滚。 2. 在事务代码中捕获了异常,是无法进行回滚的。
3. 如果是使用的spring+mvc模式。并且spring和mvc都扫描了service层(事务处理层),事务不生效。因为spring会有限加载mvc的配置文件,而事务的配置基本上都是在spring中,因为spring的子容器先于父容器启动,造成在controller中注入service时还没有加载事务。
4. mysql的myISAM引擎,是不支持事务的,需要设置为innoDB模式。
5. 事务的开启必须放到listener里面加载,如果放到dispatchServlet的配置里面,事务不生效。
6. 如果在接口中使用@Transactional,只有JDK动态代理才能生效,CGLIB动态代理是不生效的,因为注解是不能继承的。

五.如果让Exception可以进行回滚呢?

方法1:@Transactional注解指定rollbackFor=Exception.class

方法2:让throw的自定义Exception继承RuntimeException

方法3:使用自定义注解,处理回滚Exception的问题:

@Transactional(rollbackFor=Exception.class)
public @interface DolTransactional {

}

spring事务代码实践的更多相关文章

  1. Spring 事务传播实践分析

    事务管理是应用系统开发中必不可少的一部分.事物将若干的数据库操作作为一个整体控制,一起成功或一起失败.事物有以下特性 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生.   ...

  2. Spring事务源码阅读笔记

    1. 背景 本文主要介绍Spring声明式事务的实现原理及源码.对一些工作中的案例与事务源码中的参数进行总结. 2. 基本概念 2.1 基本名词解释 名词 概念 PlatformTransaction ...

  3. spring事务详解(一)初探事务

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...

  4. 一文带你认识Spring事务

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y Spring事务管理我相信大家都用得很多,但可能仅仅 ...

  5. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  6. Spring事务管理入门与进阶

    事务管理 一个数据库事务是一个单一的工作单元操作序列.这些操作应该要么完整地执行,要么完全不执行.事务管理是一个重要组成部分,事务管理可以确保数据完整性和一致性.事务具有以下四个关键特性分别是 ACI ...

  7. Spring事务传播属性有那么难理解吗?

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  8. Spring 事务 属性 详细

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  9. 理解 spring 事务传播行为与数据隔离级别

    事务,是为了保障逻辑处理的原子性.一致性.隔离性.永久性. 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据等等一系列的问题. 事务有两个重要特性: 事务的传播行为 数据隔离级别 1.事务传播行 ...

随机推荐

  1. vs的一些操作技巧:在写代码时自动换行的设置

    有时在写代码的时候,一行代码太长了,想换行,直接按回车键的话又会报错,怎么办?其实可以这样设置vs,就可以达到自动换行的效果啦. ​

  2. Update(Stage4):sparksql:第3节 Dataset (DataFrame) 的基础操作 & 第4节 SparkSQL_聚合操作_连接操作

    8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset ...

  3. python闯关之路一(语法基础)

      1,什么是编程?为什么要编程? 答:编程是个动词,编程就等于写代码,那么写代码是为了什么呢?也就是为什么要编程呢,肯定是为了让计算机帮我们搞事情,代码就是计算机能理解的语言. 2,编程语言进化史是 ...

  4. Day11 - F - A Dangerous Maze LightOJ - 1027

    求期望注意期望的定义,这题我们可以分正负数情况,设所求期望为E 正数: 1/n*x_i 负数:1/n*(E+x_j) 此时概率为1/n,根据期望定义,他回到起点后出去的期望为E,花费回起点的时间为x_ ...

  5. springBoot+MybatisPlus数据库字段使用驼峰命名法时报错

    假如有个实体类: package com.jeff.entity; public class User { /** * 主键id */ private Integer id; /** * 登陆名 */ ...

  6. PTA的Python练习题(四)

    从 第3章-1 3-1.大于身高的平均值 开始 1. 引入列表的概念 a=list(map(int,input().split())) b=sum(a) c=len(a) d=b/c for i in ...

  7. git github 对代码的管理

    参考:https://www.cnblogs.com/feynman61/p/9005252.html 一.Git 对远程仓库版本回退 场景: 同事 a.b 同时修改了代码,提交到仓库 同时 c 不熟 ...

  8. ➡️➡️➡️leetcode 需要每天打卡,养成习惯

    目录 待完成的 完成的 0204 0203 以前 java 的 ! 的操作 不像 c 那样自由,!不要使用在int 变量上 c ^ 是异或操作 体会:c中,malloc 后的新建的数组,默认不是0(j ...

  9. The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)

    题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...

  10. Spark教程——(8)本地执行spark-sql程序

    在程序中设定Spark SQL的运行模式: //.setMaster("local")设置本地运行模式 val conf = new SparkConf().setAppName( ...