您的位置:首页 > 其它

Ucenter 1.6和Discuz X2整合通信流程原理详细分析

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

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

<aop:config>
<aop:pointcut id="deleteOperation" expression="execution(* jk.dao.*.*(..))" />
<aop:advisor advice-ref="deleteTx" pointcut-ref="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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: