其实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、声明式事务
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>
<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>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<bean id="transactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 要依赖事务管理器 -->
<property name="transactionManager"><ref bean="transactionManager" /></property>
<prop key="insert*">PROPAGATION_REQUIRED,timeout_2</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>