Spring事务相关知识的记录

来源:互联网 发布:注册一个软件工作室 编辑:程序博客网 时间:2024/05/13 23:45

其实spring框架是java ee轻量级开发中,举足轻重的开源框架。其重要的核心是IOC和AOP。很多时候在项目开发中都用到了事务管理器。于是网上到处搜集资料做了一个。加之自己的理解做了一个总结。

1、事务的定义

事务(Transaction)是并发控制的单位,用户定义的操作序列。简单的说:就是用户定义的一些操作,要么做完,做不完就不做。就像银行转账操作,除了减去自己账户的钱以外,还要新增转账账号的钱。是一个整体。不可分割的单位。

2、事务运行有三种模式

自动提交事务:每个独立的语句都是一事务,每句后面都有一个COMMIT

显示事务:以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束

隐性事务:在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束

3、事务的特性

原子性Atomicity:事务是数据库的逻辑单位,是一个完整的操作,事务的各元素是不可分的,事务的所有元素必须作为一个整体提交或回滚

一致性Consistency:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的

隔离性(Isolation):一个事务的执行不能被其他事务干扰

持续性/永久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

4、JAVA中普通编程的事务操作,传统的JDBC事务操作

Connection conn = null; 

try {

conn = DBConnectionFactory.getConnection; 

conn.setAutoCommit(false); 

  //do something 

 conn.commit(); 

//commit transcation 

} catch(Exception e) { 

conn.rollback(); 

} finally {

try { 

conn.close(); 

 } catch(SQLException sqle) {

 //do sth.

}

按照以往的思路,代码量就比较长,我们通常会新建一个DBTool的工具类,来进行一些操作。比如关闭资源。

5、Spring的事务原理

spring提供了几个关于事务处理的类: 

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,

我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

6、编程式事务一般使用transactionTemplate进行操作

7、声明式事务

spring中的声明式事务,一般使用TransactionProxyFactoryBean:
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="proxyTargetClass" value="true" />
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="delete*">
PROPAGATION_REQUIRED,-Exception
</prop>
</props>
</property>
</bean>
一些KEY值的意思
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作
8、JDBC的Spring事务管理器配置例子
<!-- 加载jdbc.properties配置文件-->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>

<!-- 配置数据源,读取jdbc.properties配置文件 -->
<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="${jdbc.driver}" />
<property name="driverUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="alias" value="${jdbc.alias}" />
<property name="simultaneousBuildThrottle"
value="${jdbc.simultaneousBuildThrottle}" />
<property name="maximumActiveTime"
value="${jdbc.maximumActiveTime}" />
<property name="houseKeepingTestSql"
value="${jdbc.houseKeepingTestSql}" />
<property name="maximumConnectionCount"
value="${jdbc.maximumConnectionCount}" />
<property name="minimumConnectionCount"
value="${jdbc.minimumConnectionCount}" />
<property name="delegateProperties"
value="characterEncoding=${jdbc.characterEncoding}" />
</bean>

<!-- 配置JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>

<!-- 配置事件代理工厂 -->
<bean id="transactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 要依赖事务管理器 -->
<property name="transactionManager"><ref bean="transactionManager" /></property>
<!-- 要依赖代理方式 -->
<property name="proxyTargetClass" value="true"></property> 
<!-- 要依赖事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="query*">PROPAGATION_REQUIRED,timeout_1,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED,timeout_2</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

原创粉丝点击