Java中(声明式事务)与(编程式事务)

  • Post author:
  • Post category:java



1、什么是(编程式)事务?

编程式(事务)就是(程序员)手动进行(事务管理),比如:JDBC中自己(手动将:数据提交到数据库)。


2、什么是(声明式)事务?

事务控制代码已经由 (spring 写好).程序员只需要(声明)出(哪些方法)需要进行(事务控制)和(如何进行)事务控制.


3、那么(声明式)事务(如何实现)呢?

一、在 Spring 的 applicationContext.xml中导入:tx.xsd
二、形成切面如下:
<aop:config>
	<aop:pointcut expression="execution(* com.yyy.serviceImpl.UserServiceImpl.*.*(..))" id="affair"/>
	<aop:advisor advice-ref="待填" pointcut-ref="affair"/>
</aop:config>
三、连接数据库如下:
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        	<property name="dataSource" ref="dataSource"></property>
        </bean>
四、为需要进行(事务管理)的(方法)进行(声明)
    <tx:advice id="txAdvice" transaction-manager="txManager">
    	<tx:attributes>
    		<tx:method name="get*" rollback-for="defualt" propagation="REQUIRED" isolation="SERIALIZABLE"/>
    	</tx:attributes>
    </tx:advice>


4、最后:将(步骤四)需要事务管理的(id = “txAdvice”)填入切面


在这里插入图片描述

5、补充一些参数取值:

在这里插入图片描述

一、propagation(控制事务传播行为)

1、REQUIRED (默认值): 如果当前有事务,就在事务中执行,如果当前没有事务,新建一个事务. 
2、SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事
务,就在非事务状态下执行
3、MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错. 
4、REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起. 
5、NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起.
6、NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行, 如果当前有事务,报错. 
7、NESTED:必须在事务状态下执行.如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务. 
二、isolation(事务隔离级别)

1、DEFAULT: 默认值,由底层数据库自动判断应该使用什么隔离界级别
2、READ_UNCOMMITTED: 可以读取未提交数据,可能出现脏读,不重复读,幻读.
3、READ_COMMITTED:只能读取其他事务已提交数据.可以防止脏读,可能出现不可重复读和幻读. 
4、REPEATABLE_READ: 读取的数据被添加锁,防止其他事务修改此数据,可以防止不可重复读.脏读,可能出现幻读. 
5、SERIALIZABLE: 排队操作,对整个表添加锁.一个事务在操作数据时,另一个事务等待事务操作完成后才能操作这个表.