Spring揭秘-事务管理

  1. 什么是事务?
    事务就是以可控的方式对数据资源进行访问的一组操作,它有四个限定属性,原子性、一致性、隔离性、持久性,就是我们常称的ACID属性。
  2. 隔离性的四种隔离级别由弱到强分别是Read Uncommited、Read Commited、Repeatable Read、Serializable。
  • Read Uncommited
    最低的隔离级别,可以读取到其他事务未提交的数据,无法避免脏读,幻读,不可重复读等问题。
    • 脏读
      读取到另一个事务未提交的数据,然后那个事务回滚了,那我们读到的数据就是脏数据。
    • 不可重复读
      在同一个事务中对同一笔数据进行多次读取,读取到的结果不完全相同。比如在Read Commited隔离级别,一个事务在另一个事务提交数据前读一次,提交后读一次,两次读取的结果不一致。
    • 幻读
      同一个事务中对多条记录(聚合操作也算)进行查询结果不完全相同的情况叫幻读,比如事务A查询表发现表为空,然后准备插入一个主键为1的数据,在事务A插入之前,事务B完成了插入主键为1数据的操作,在Repeatable Read级别,事务A对B事务的插入操作不可见(因为Repeatable Read能避免不可重复读),但当A事务插入数据时报错,发现表里已经有主键为1的数据了。
  • Read Commited
    隔离级别比Read Uncommited 高,通常是数据库默认的隔离级别,一个事务的更新操作只有在事务提交后才能被读取到。可以避免脏读,但无法避免幻读和不可重复读
  • Repeatable Read
    可重复读,它可以保证在整个事务过程中,对同一笔数据读取的结果是相同的,不管其他事务是否对该笔数据进行更新。可以避免脏读和不可重复读,但是不可避免幻读。
  • Serializable
    最为严格的隔离级别,所以操作必须按照顺序执行,可以避免所有的问题,但是效率最低
  1. 全局事务和局部事务
    全局事务也叫分布式事务,通过两阶段提交协调多RM(Resource Manager一般是数据库)之间的事务处理,有个非常恰当的例子是婚礼上主持会分别问男女双方你愿意嫁给他吗?如果有任意一方拒绝,就各自回滚到单身状态。TP Monitor负责在分布式事务中协调多个RM的事务处理,TM是它的核心模块。


    全局事务

    只有一个RM参与的就叫局部事务,它不必引进TP Monitor,应用程序可以直接和RM打交道,全局事务和局部事务的区别是涉及多少RM,如果系统中有多个RM,但是事务只涉及一个RM,同样是局部事务。

  2. Spring事务


    Spring事务抽象接口关系图
  • TransactionDefinition
    TransactionDefinition定义了事务的隔离级别,传播行为,事务的超时时间,是否为只读事务。
public interface TransactionDefinition {
    /*传播行为*/
    //如果当前存在一个事务,则加入当前事务,如果不存在,则新建一个事务,至少保证在一个事务中运行
    int PROPAGATION_REQUIRED = 0;
    //如果当前存在一个事务,则加入当前事务,如果不存在,则直接执行
    int PROPAGATION_SUPPORTS = 1;
    //强制要求当前存在一个事务,如果不存在则跑出异常
    int PROPAGATION_MANDATORY = 2;
    //不管当前是否存在事务,都会创建新的事务,如果当前存在事务会挂起当前事务
    int PROPAGATION_REQUIRES_NEW = 3;
    //不支持当前事务,在没有事务的情况下执行,如果当前存在事务,会挂起当前事务
    int PROPAGATION_NOT_SUPPORTED = 4;
    //永远不需要当前存在事务,如果存在则抛出异常
    int PROPAGATION_NEVER = 5;
    //如果存在当前事务,则在当前事务的一个嵌套事务中执行
    int PROPAGATION_NESTED = 6;
    /*隔离级别*/
    //表示使用数据库默认的隔离级别
    int ISOLATION_DEFAULT = -1;
    //对应Read_Uncommitted隔离级别,无法避免脏读,不可重复读和幻读
    int ISOLATION_READ_UNCOMMITTED = 1;
    //对应Read Committed隔离级别,无法避免不可重复读和幻读
    int ISOLATION_READ_COMMITTED = 2;
    //对应Repeatable Read, 无法避免幻读
    int ISOLATION_REPEATABLE_READ = 4;
    //对应Serializable隔离级别,并发行最低,能避免所有问题
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();

    int getIsolationLevel();

    int getTimeout();

    boolean isReadOnly();

    String getName();
}
  • PROPAGATION_SUPPORTS和PROPAGATION_NOT_SUPPORTS的区别


  • PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED的区别


  • TransactionStatus
    PlatfornTransactionManager的getTransaction会返回一个Transaction对象,可以通过它查询事务的状态
public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();

    boolean hasSavepoint();

    //标记当前事务使其回滚
    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}
  • PlatformTransactionManager
public interface PlatformTransactionManager {
    /*getTransaction会开启一个事务,但在此之前需要判断是否存在是否,
    如果存在则根据传播行为决定是挂起事务或者抛出异常,
    不存在事务,同样需要根据传播行为决定如何处理*/
    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;
    /*检测全局的rollBackOnly,如果被设置则执行回滚*/
    void commit(TransactionStatus var1) throws TransactionException;
    /*检测全局的rollBackOnly,如果没被设置则执行提交*/
    void rollback(TransactionStatus var1) throws TransactionException;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 很多人喜欢这篇文章,特此同步过来 由浅入深谈论spring事务 前言 这篇其实也要归纳到《常识》系列中,但这重点又...
    码农戏码阅读 4,726评论 2 59
  • Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,...
    EnigmaXXX阅读 668评论 0 0
  • 洛小汐阅读 181评论 3 1
  • 今天下午我和我的好朋友思语和思同一起玩了一个游戏,名字叫起床游戏,游戏规则是一个人当起床闹钟,另外两个人当被吵醒的...
    津妍宝贝阅读 937评论 0 1