SSH和合心得02 (Spring控制事务)

这几天被事务困住了许久,按很多前辈说的方法配置都未成功,通过大量的搜索才找到原因。


Spring 使用AOP事务时容易出错的点(使用这种方式的事务需要导入aspectjrt.jar,aspectjweaver.jar 两个包Spring/lib/aspectj)

<aop:config>
  <aop:pointcut id="deleteOperation" expression="execution(* jk.dao.*.*(..))" />
  <aop:advisor advice-ref="deleteTx" [b]pointcut-ref[/b]="deleteOperation"/>
</aop:config>


加粗的地方就是容易写错的,这点一般习惯性的用eclipse自带的提示首先会出现  pointcut  而不是  pointcut-ref  就是这个细微差别就会引起错误。


关键点最难发现的错误
因为我试了很多种方式都没成功,我就怀疑是其它地方引起的,就去搜索相关事务不成功的问题,无意中发现一个回答说Mysql里面建的表如果不是  Innodb  就不能支持事务!!马上去尝试,结果就是这个原因引起


例子SQL:
DROP TABLE IF EXISTS `ssh`.`sshuserinfo`;
CREATE TABLE  `ssh`.`sshuserinfo` (
  `userid` bigint(20) NOT NULL,
  `username` varchar(10) default NULL,
  `age` int(11) default NULL,
  `BIRTHDAY` date default NULL,
  PRIMARY KEY  (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


常用Spring的事务控制方法

定义一个基础的事务配置
key="deleteArray" 这种配置代表方法名为这个的就会进行事务控制,"delete*" 表示只要是以delete开头的方法都会控制事务,PROPAGATION_REQUIRED 是事务控制的其它一种,及当前没有事务打开一个,在这个方法中其它方法在执行的时候如果当前有事务就用当前这个,没有就创建一个,这种基本满足我们普通的事务控制,另外还有3种,可以看Spring的文档和查询这方面的资料

<bean id="proxybase" 
   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
   <property name="transactionManager" ref="transactionManager" /> 
   <property name="transactionAttributes"> 
    <props> 
     <prop key="deleteArray">PROPAGATION_REQUIRED</prop> 
     <prop key="update*">PROPAGATION_REQUIRED</prop> 
     <prop key="modify*">PROPAGATION_REQUIRED</prop> 
    </props> 
   </property> 
  </bean>  

在使用事务的时候只需要定义相应的代理类继承于基础事务,然后指定需求代理的目标类就能完成事务控制 
<bean id="userInfoDAOProxy" parent="proxybase">
 	<property name="target" ref="userInfoDAO"/>
 </bean>



你可能感兴趣的:(eclipse,spring,AOP,mysql,ssh)