事务—事务模型

程序猿基础知识的学习、理解、整理——事务(方方土)

事务,看似很简单,其实很复杂,作为一个程序猿,你对事务到底了解多少。下面主要以一个JAVA程序猿的角度来阐述一下事务。以下内容主要是读书《java事务设计策略》的笔记以及基于平时一些认知的总结,非原创!!^_^,还有“简书”真实不错,很好的一个工具,推荐使用

什么是事务?ACID(原子性、一致性、独立性、持久化)

  • 原子性:事务内的操作作为一个独立的单元提交,或者回滚;
  • 一致性:保证事务的操作部破坏数据的完整性约束;
  • 独立性:保证事务间的可见性
  • 持久化:保证事务的操作是可持久的;
  • 什么是事务模型?这里提到的事务模型主要是阐述的是怎么样来管理事务的概念。分为以下三种事务模式:本地事务模型,编程式事务模型,声明式事务模型

    为什么要提事务模型这个概念,其实本质上事务模型也就是一个抽象的概念,主要体现的是开发人员在不同的场景下,用不同的方法来实现事务的管理,从以下内容的描述,希望可以叫直观地表达了这些事务模型的不同点,这些事务模型的优缺点点。

    从我的编程习惯来说,经历过本地事务模型的阶段,经历过编程式事务模型的阶段,到现在基本上使用声明式的事务模型,我感觉这三种方式是不断进化的过程。用过才知道,哪个好。就好比大家现在都用spring,都说spring好,那它究竟好在哪里呢?究竟解决了些什么问题呢?只有比较才知道。

  • 本地事务模型:事务由本地资源管理器来管理,对于开发人员而言,管理的是“连接”,而非“事务”
    • 直观感受一下什么叫“本地事务模型”

    public void update TradeOrder(TradeOrderDate order)

    throws Exception{

    DataSource ds = (DataSource)

    (new InitialContext()).lookup("jdbc/MasterDS");

    conn = ds.getConnection();

    conn.setAutoCommit(false);

    Statement stmt  = conn.createStatement();

    String sql = "update trade_order ....";

    try{

    stmt.excuteUpdate(sql);

    conn.commit();

    }catch(Exception e){

    conn.rollback();

    throws e;

    }finally{

    stmt.close;

    conn.close;

    }

    }

    很简单的一个jdbc操作的一个函数,就在这个函数中包含了本地事务模型的概念,标粗部分,其实在这个函数中,对于开发人员而言,获取的是一个数据库的连接conn,而不是一个事务,所以在这个函数中,对于开发人员而言,没有事务的操作,事务是通过conn委托给数据库去操作的;

    • “本地事务模型”存在什么问题

    1、对于开发人员的侵入性较大,开发人员在编码的时候,时刻要想着commit,commit,commit,且都是一些重复代码;

    2、如果涉及两个方法调用,比如有方法A,调用方法B和方法C,大家想想,如果采用本地事务模型,那么这个时候的方法A还是一个事务吗?所以,开发人员在设计的时候,要想的很清楚,到底有哪些方法

    3、如果涉及到XA,比如一个方法中既有jdbc操作,又有jms操作,该怎么办呢?

    4、所以,如果是自己写一个jdbc的小DEMO,那么可以用本地事务模型这种方式来玩玩,如果是在大型的系统建设中,就务必要杜绝。

  • 编程式事务模型:事务通过JTA以及底层的JTS实现来管理,对于开发人员而言,管理的是“事务”,而非“连接”
    • 直观感受一下什么叫“编程式事务模型”

    Public void updateTradeOrder(TradeOrderData order)
    throws Exception{
    UserTransaction txn = sessionCtx.getUserTransaction();
    txn.begin();
    try{
    TradeOrderDao dao = new TraderOrderDao();
    dao.updateTradeOrder(order);
    txn.commit();
    }catch(Excption e){
    log.fatal(e);
    txn.rollback();
    throw e;
    }
    }
    很简单的一个更新操作的一个函数,就在这个函数中包含了编程式事务模型的概念,标粗部分,其实在这个函数中,对于开发人员而言,获取的是一个事务对象txn,而不是一个数据库连接,所以在这个函数中,对于开发人员而言,是通过txn来管理事务的;

    • “编程式事务模型”存在什么问题

    1、编程式事务,事务的管理要由开发人员自己来管理,要考虑好事务提交,事务在异常情况下的处理等等事宜,是一件比较繁琐,容易出错的事情
    2、编程式事务的上下文传递问题,什么是事务上下文传递呢?举例来说,方法A调用了方法B,(方法A和方法B都采用编程式的事务模型),那么方法A中创建的事务无法传递到方法B中。大家想想看,其实很多业务场景,在方法A调用方法B的这种场景下,我们都认为方法A整体是一个事务,但是如果采用编程式事务模型,那么它内部本质是两个事务;

  • 声明式事务模型:事务由容器进行管理,对于开发人员而言,几乎不管理事务
    • 直观感受一下什么叫“声明式事务模型”

    @TransactionAttribute(TransactionAttribute.Type.Required)
    public void updateTradeOrder(TradeOrderData order)
    throw Exception{
    try{
    TradeOrderDao dao = new TradeOrderDao();
    dao.updateTradeOrder(order);
    }catch (Exception e){
    sessionContext.setRollbackOnly();
    throw e;
    }
    }
    很简单的一个操作,大家发现在这个函数中,没有用到连接,也没有看到事务,而只是有一行注解,就是通过这行注解就将这个函数的失去托管给容器去管理了。

    • “声明式事务模型中的事务属性”

    1、Required(需要一个事务,如果上下文中已有事务,则用之,如没有,则新建一个事务。说明上下文事务是传递的)
    2、Mandatory(需要一个事务,如果上下文中没有事务,就报异常。说明上下文事务是传递的,而且必须要通过上下文事务的传递)
    3、RequiredNew(需要一个事务,如果上下文中有事务,将该事务挂起,新开一个事务。说明上下文事务是不传递的)
    4、Supports(不需要一个事务,如果上下文中有事务,则用之,如果没有,则不用事务)
    5、NotSupported(不需要一个事务,如果上下文中有事务,则暂停事务,运行结束后,再开启事务)
    6、Never(不需要一个事务,如果在上下文中有事务,就报异常)

    好,到这里,有两个问题,需要大家去思考一下?
    1、到底我们的哪些方法需要事务?哪些方法不需要事务?事务给我们带来的开销是什么?
    2、在我们的程序中,事务到底要控制在哪里,控制在在DAO层,还是控制在Service层?为什么?
    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 206,839评论 6 482
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 88,543评论 2 382
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 153,116评论 0 344
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 55,371评论 1 279
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 64,384评论 5 374
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 49,111评论 1 285
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 38,416评论 3 400
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 37,053评论 0 259
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 43,558评论 1 300
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 36,007评论 2 325
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 38,117评论 1 334
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,756评论 4 324
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 39,324评论 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 30,315评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,539评论 1 262
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 45,578评论 2 355
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 42,877评论 2 345

    推荐阅读更多精彩内容