首页 > 代码库 > 事务管理

事务管理

1、事务是恢复和并发控制的基本单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,这是一个不可分割的工作单位,目的是为了保证服务器数据的完整性

2、事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
     COMMIT表示提交,即提交当前事务的所有操作;
     ROLLBACK表示回滚,也就是在事务运行的过程中发生了某些个故障,事务不能够继续运行系统将事务中对数据的已经完成的操作悉数回滚,返回到事务处          理前的状态。

3、事务的特性
      a:原子性
           事务是数据库的逻辑工作单位,事务中包括的诸多操作要么全做,要么全不做!
      b:一致性
           事务执行的结果必须是使数据库从一个一致性装态到另一个一致性装态,这个和原子性是相关联的
      c:隔离性
           事务与事务之间不能被相互干扰
      d:永久性(持续性)
          事务一旦提交,那么对数据库的改变就是永久性的。

4、事务的传播特性:
      a:REQUIRED 如果存在一个事务则支持当前事务。没有事务则开启一个新的事务。
      b:SUPPORTS 如果存在一个事务则支持当前事务。没有实物则非事务的执行。
      c:MANDATORY 如果已经存在一个事务则支持当前事务。如果没有一个活动的事务则抛出异常。
      d:REQUIRES_NEW 总是开启一个新的事务。如果当前有一个事务存在,则将当前事务挂起。
      e:NOT_SUPPORTED 总是非事务的执行,并挂起任何事务
      f:NETER 总是非事务的执行,如果存在一个活动的事务则抛出异常 
      g:NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务则按照REQUIRED执行

5、事务的隔离级别
      a:DEFAULT 使用数据库默认的隔离级别
      b:READ_UNCOMMITTED 事务的最低隔离级别,允许另外一个事务可以看到这个事务未提交的数据,这个级别会产生:脏读、幻读、不可重复读
      c:READ_COMMITTED 保证一个事务修改的数据提交之后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
      d:REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
      e:SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

6、概念介绍
      脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
因为这个数据是还没有提交的数据, 那么另外一 个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

        幻读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及 到表中的全部数据行。同时,第二个事务也修
改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

        不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

7、spring事务管理
        spring支持编程式事务管理和声明式事务管理两种方式。
        编程式事务管理使用TransactionTemplate或者PlatformTransactionManager。spring推荐使用前者;
        声明式的事务管理建立在AOP基础之上,其本质是对方法的前后进行拦截,在目标方法开始前创建或者是加入一个事务,在执行完目标方法之后根据执行情 况提交或者回滚事务。
        声明式事务管理的有点就是不需要通过编程的方式管理事务,只需要在配置文件中做相关的事务规则声明或者是通过@Transaction注解便可以将事务应用到业务逻辑中;缺点是声明式事务最小力度就是方法级而无法作用到代码块或更低级别;

声明式事务管理配置方式参考站点:http://java.9sssd.com/javafw/art/1215

applicationContext.xml中事务配置:
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 指定管理的方法以及传播属性和隔离级别等等 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!-- 使用AOP管理事务管理使用时机 -->
<aop:config>
<aop:pointcut expression="service" id="* *.service.*Service.*(..)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="service"/>
</aop:config>

事务管理