Spring事务管理

一、初步理解

    理解事务之前,先讲一个你日常生活中最常干的事:取钱。

  比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣  除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双  方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。

  事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的  状态,仿佛什么都没发生过一样。

  在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

  1.  事务的特性:

    1.1   原子性:事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

    1.2   一致性:一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

    1.3     隔离性:可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

    1.4     一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

         2.      核心接口

          

 

        

二、事务属性

  1. 传播规则
  2. 隔离规则:定义了一个事务可能受其他并发事务影响的程度

    a) 并发事务引起的问题

    2.1     脏读:脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。回滚规则

    2.2     不可重复读:不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更              新。

               (不可重复读的重点是修改,比如一个事务1查询工资为1000,事务2工资给加了1000, 并commit了事务,事务1中,再次查询工资为2000)

    2.3     幻读:幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就          会发现多了一些原本不存在的记录。

        (幻读的重点是增加、删除,比如一个事务1查询工资为1000的员工有10个,事务2又给一个员工发了1000工资, 并commit了事务,

        事务1中,再次查询记录数有11条了)

  1. 事务超时
  2. 回滚规则

三、其他

  1. 在spring中可以在service中调用另一个service吗?

————回答:

最好不要这么调用,spring的事务管理,切面是配置service接口。 Service调用service会带来事务上的嵌套,两个service应该避免双向依赖。

posted @ 2018-03-13 11:49  nemobischon  阅读(93)  评论(0编辑  收藏  举报