码迷,mamicode.com
首页 > 其他好文 > 详细

SSH、IBatis等框架相关知识

时间:2016-08-18 14:44:34      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:spring   事务   声明式   

Spring的事务

    事务使用ACID特性来衡量事务的质量。这些特性包括原子性、一致性

隔离性和持久性。

    a.原子性:事务必须是原子的。不可分割的,在事务结束的时候,事务中的所有任务必须全部成功完成或者全部任务失败,事务回滚到事务开始之前的状态

    b.一致性:数据库中的所有数据必须和现实保持一致。

    c.隔离性:事务与事务之间的屏障。每个事务必须与其他事务的执行结果隔离开,直到该事务执行完毕。

    d.持久性:如果事务成功执行,无论系统发生什么情况,事务的持久性必须保证事务的执行结果是永存的。

    在事务处理中有违反ACID特性的三个问题:脏读、不可重复读和幻读。

    脏读:当一个事务读取了一个事务尚未提交的更新,就叫作脏读取。

    不可重复读:在一个事务中执行多次同样的查询操作,但每次查询的结果都不相同,叫不可重复读

    幻读:一个事务的更新结果影响到了另一个事务的问题。

    Spring的事务管理器有5个,也即DataSourceTransactionManager(JDBC事务管理器),HibernateTransactionManager(Hibernate事务管理器),JdoTransactionManager(JDO事务管理器),JtaTransactionManager(Jta事务管理器)以及Apache的OJB事务管理器。

    Spring支持声明式事务,并建议这样做。因为Spring中的事务是基于AOP实现的,而Spring的AOP是以方法为单位的,所以Spring的事务属性就是对事务应用到方法的策略描述,这些属性分别为:传播行为、隔离级别、只读和超时属性。

    事务的传播行为是事务应用于方法的边界,它定义了事务的建立、暂停等行为。

    事务的隔离级别:为了解决事务之间的3个缺陷,必须在事务之间建立隔离关系来保障事务的完整性。

    事务的只读属性:在数据库的操作中,查询是使用最频繁的操作,每次执行查询操作时都要从数据库中重新读取数据,有时多次读取的数据都是相同的,这样的操作浪费了系统资源和影响了系统速度。如果将食物声明为只读,那么数据库可以根据事务的特性优化事务的读取操作。事务的只读属性需要配合事务的PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED传播行为共同设置。

    事务的超时属性:设置了事务的超时时间。

    Spring的声明式事务不涉及组建依赖关系,它通过AOP实现事务管理。在使用Spring的声明式事务时不需要编写任何代码。使用事务代理工厂来管理事务。事务代理工厂TransactionProxyFactoryBean包含了事务拦截器、目标代理和事务的属性设置。

    Spring使用注解式进行事务管理,配置示例

    步骤一、在Spring配置文件中引入<tx:>命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
 xmlns:context="http://www.springframework.org/schema/context"  
 xmlns:p="http://www.springframework.org/schema/p"  
 xmlns:mvc="http://www.springframework.org/schema/mvc"  
 xmlns:aop="http://www.springframework.org/schema/aop"  
 xmlns:tx="http://www.springframework.org/schema/tx"  
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
      http://www.springframework.org/schema/context  
      http://www.springframework.org/schema/context/spring-context.xsd  
      http://www.springframework.org/schema/mvc  
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
      http://www.springframework.org/schema/aop  
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    步骤二、具有@Transactional注解的bean自动配置为声明式事务

<!-- 事务管理 -->
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     	<property name="dataSource" ref="dataSource"></property>
     </bean>
     <!-- 配置事务增强器 -->
	<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
		<!-- 配置详细事务处理语义 -->
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="saveOrUpdate*" propagation="REQUIRED"/>
			<tx:method name="get*" propagation="SUPPORTS"/>
			<tx:method name="find*" propagation="SUPPORTS"/>
			<tx:method name="load*" propagation="SUPPORTS"/>
			<tx:method name="select*" propagation="SUPPORTS"/>
			<!-- 其他采用默认方式 -->
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>
	<!-- SpringAOP事务管理 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.jf.service..*impl.*(..))" id="transactionPointCut"/>
		<!-- 指定txAdvice切入点应用txAcvice食物增强处理 -->
		<aop:advisor advice-ref="transactionAdvice" pointcut-ref="transactionPointCut"/>
	</aop:config>


本文出自 “阿酷博客源” 博客,请务必保留此出处http://aku28907.blog.51cto.com/5668513/1839833

SSH、IBatis等框架相关知识

标签:spring   事务   声明式   

原文地址:http://aku28907.blog.51cto.com/5668513/1839833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!