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: 排队操作,对整个表添加锁.一个事务在操作数据时,另一个事务等待事务操作完成后才能操作这个表.