`
joychi85
  • 浏览: 2182 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring事务学习笔记(一)

阅读更多
//事务隔离和事务传播相关记载
事务隔离:
● 幻像读取(phantom read) 事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用查询中的WHERE子句的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为"幻像",因为对于T1来说这一行就像是变魔术似地突然出现了一样。
● 不可重复读取(nonrepeatabl read) 事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录的内容。然后T1又再次读取这一行记录,发现它与刚才读取的结果不同了。这中现象称为"不可重复"读,因为T1原来读取的那一行记录已经发生了变化。
● 脏读(dirty read) 事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取更新后的行。然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了(也称为"脏"数据),因为在T2读取这行记录时,T1所做的修改并没有提交。
SQL数据库实现了不同级别的事务隔离性:
引用
● READ UNCOMMITTED 幻像读、不可重复读和脏读都允许。
● READ COMMITTED   允许幻像读和不可重复读,但是不允许脏读。
● REPEATABLE READ  允许幻像读,但是不允许不可重复读和脏读。
● SERIALIZABLE     幻影读、不可重复读和脏读都不允许。

Oracle数据库支持READ COMMITTED和SERIALIZABLE两种事务隔离性级别,Oracle数据库默认使用的事务隔离性级别却是READ COMMITTED。而SQL标准定义的默认事务隔离性级别是SERIALIZABLE。

Spring中对事务传播的定义:
引用
●PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
●PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
●PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
●PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
●PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
●PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
●PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。


//Spring事务配置
提供统一的API处理不同的事务管理策略。

//Spring事务控制接口和方法
org.springframework.transaction.PlatformTransactionManager接口提供了Spring的事务策略
//接口如下定义
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}

TransactionDefinition接口定义了相关了事务属性包括:
  1. Isolation:事务级别
  2. Propagation:传播方式
  3. Timeout:事务延迟时间
  4. Read-only status:是否只读状态

TransactionStatus接口提供了简便的方法来控制事务执行和查询事务状态,
//接口如下定义
public interface TransactionStatus {
boolean isNewTransaction();
void setRollbackOnly();
boolean isRollbackOnly();
}


//简单的Spring事务管理器配置(XML-Based),根据不同事务管理机制
<!--jdbc-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>


<!--JTA-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- other <bean/> definitions here -->
</beans>


<!--Hibernate-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=${hibernate.dialect}
</value>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


//Spring提供的持久层操作模板类
JdbcTemplate, HibernateTemplate, 和 JdoTemplate 类等。

//Spring声明方式应用程序关联事务配置
//基本配置举例
<!-- base on aop -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- this is the service object that we want to make transactional -->
<bean id="fooService" class="x.y.service.DefaultFooService"/>
Transaction management
Spring Framework (2.5.6) 228
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution
of an operation defined by the FooService interface -->
<aop:config>
<aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
<!-- don't forget the DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>
<!-- similarly, don't forget the PlatformTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- other <bean/> definitions here -->
</beans>

//Spring事务回滚的条件
要求捕获的异常是uncheck Exception.
可以关联框架的任何层次任何方法上。比如service层的某个方法上


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics