首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

SSH和合经验02 (Spring控制事务)

2012-10-09 
SSH和合心得02(Spring控制事务)这几天被事务困住了许久,按很多前辈说的方法配置都未成功,通过大量的搜索才

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"    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>



热点排行