JavaEE应用中的传统事务有两种策略:全局事务和局部事务,全局事务由应用服务器管理,需要底层服务JTA(java transaction API 支持分布式事务)支持。局部事务和底层所采用的持久化技术有关(JDBC,Hibernate……)。
在spring中,spring采用观察者模式,通过PlatformTransactionManager接口体现,随着底层不同的事务策略来切换,应用不同的实现类。
理论性的东西就不多说了,大家自己看吧,我也懂得不多,现在就写下spring中怎么配置JDBC,hibernate事务(JTA没有用过,在这里就不班门弄斧了)
<!-- 连接池proxool配置,先配置数据源 -->
<bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="driverUrl" value="jdbc:mysql://127.0.0.1:3306/home?characterEncoding=UTF-8"> </property>
<property name="user" value="****"></property>
<property name="password" value="***"></property>
<property name="alias" value="home_pool" />
<property name="prototypeCount" value="2" />
<property name="maximumConnectionCount" value="24" />
<property name="minimumConnectionCount" value="8" />
<property name="simultaneousBuildThrottle" value="24" />
<property name="maximumActiveTime" value="300000" />
<property name="houseKeepingSleepTime" value="99000" />
<property name="houseKeepingTestSql" value="select 1 from dual" />
</bean>
JDBC局部事务管理器
<bean id="transactionManager"
class="org.springframework.jdbc.datesource.DataSourceTransactionManager">
<property name="dateSource" ref="dateSource" />
</bean>
Hibernate需要配置sessionfactory
<!-- sessionFactory配置 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="DataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- 指定Hibernate持久化操作的批操作大小 -->
<prop key="hibernate.jdbc.batch_size">30</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.max_fetch_depth">1</prop>
<prop key="hibernate.default_batch_fetch_size">10</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.transaction.flush_before_completion">true</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/cn/life/entity</value>
</list>
</property>
</bean>
这里面的具体参数配置就不讲了,我们专门看事务配置
HIbernate局部事务管理器
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
======================================================================================
事务管理器配置好后,接下来就要为业务逻辑Bean配置事务代理了
<bean id="newsDaoTrans"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="目标beanID" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
AOP配置方式如下,用AOP记得引入AOP schema:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="query*" propagation="REQUIRED" read-only="true"/>
<tx:method name="search*" propagation="REQUIRED" read-only="true"/>
<tx:method name="pagedQuery*" propagation="REQUIRED" read-only="true"/>
<tx:method name="display*" propagation="REQUIRED" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config><!--给cn.life.*.service.*包下的所有方法加事务 -->
<aop:pointcut id="interceptorPointCuts"
expression="execution(* cn.life.*.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
以上就把事务配置好了,两种配置方式我想,通过代码应该明白他们的优缺点了吧,TransactionProxyFactoryBean配置策略虽然易懂,但是配置反锁,每个目标bean都要配置,这会导致配置文件繁琐,tx命名空间配置事务管理就更加的简洁。当然tx还有更负责的配置及注解式事务配置,在这里就不深究了。