论坛首页 Java企业应用论坛

『出错』同一Service调用多个dao的一事务问题!!

浏览 23347 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-12-05  
to: "dwygp"

    1、首先你确定了你的mysql中数据库中要操作的表的Engine为:InnoDB

Row_format为:Dynamic

  2、从你的的代码中我没看到你为你的serviceImpl注入要管理事务的DAO,不知是不是没有帖出来。
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" />
</property>
</bean>

写成这样:
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" >
    <property name="cmdItemDAO"><ref local="cmdItemDAO"/></property>
<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property>
<bean>
</property>
</bean>

     3、如果排除是数据库的问题后,建议你先用代码做事务声明。如下例子:
   DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);;

TransactionStatus status = transactionManager.getTransactionDefinition(def);;

try {
    for(int i = 0; i < ids.length; i++ ); { 
cmdFunc = (CmdFunc);cmdFuncDAO.getObjectById(Long.valueOf(ids[i]););; 
cmdItemDAO.delCmdFuncId(cmdFunc);; 
cmdFuncDAO.deleteObjectById(Long.valueOf(ids[i]););; 
} 

} catch (MyException ex); {
    transactionManager.rollback(status);;
    throw ex;
}
transactionManager.commit(status);;


这样可以出错可以回滚证明是配置的问题。最后建议所出错信息帖出来!

good luck
0 请登录后投票
   发表时间:2005-12-05  
flyjie 写道
to: "dwygp"

    1、首先你确定了你的mysql中数据库中要操作的表的Engine为:InnoDB

Row_format为:Dynamic

  2、从你的的代码中我没看到你为你的serviceImpl注入要管理事务的DAO,不知是不是没有帖出来。
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" />
</property>
</bean>

写成这样:
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" >
    <property name="cmdItemDAO"><ref local="cmdItemDAO"/></property>
<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property>
<bean>
</property>
</bean>

     3、如果排除是数据库的问题后,建议你先用代码做事务声明。如下例子:
   DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);;

TransactionStatus status = transactionManager.getTransactionDefinition(def);;

try {
    for(int i = 0; i < ids.length; i++ ); { 
cmdFunc = (CmdFunc);cmdFuncDAO.getObjectById(Long.valueOf(ids[i]););; 
cmdItemDAO.delCmdFuncId(cmdFunc);; 
cmdFuncDAO.deleteObjectById(Long.valueOf(ids[i]););; 
} 

} catch (MyException ex); {
    transactionManager.rollback(status);;
    throw ex;
}
transactionManager.commit(status);;


这样可以出错可以回滚证明是配置的问题。最后建议所出错信息帖出来!

good luck



好,我试试...
0 请登录后投票
   发表时间:2005-12-05  
flyjie 写道
to: "dwygp"

    1、首先你确定了你的mysql中数据库中要操作的表的Engine为:InnoDB

Row_format为:Dynamic

  2、从你的的代码中我没看到你为你的serviceImpl注入要管理事务的DAO,不知是不是没有帖出来。
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" />
</property>
</bean>

写成这样:
<bean id="cmdFuncService" parent="baseTxProxy">
<property name="target">
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" >
    <property name="cmdItemDAO"><ref local="cmdItemDAO"/></property>
<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property>
<bean>
</property>
</bean>

     3、如果排除是数据库的问题后,建议你先用代码做事务声明。如下例子:
   DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);;

TransactionStatus status = transactionManager.getTransactionDefinition(def);;

try {
    for(int i = 0; i < ids.length; i++ ); { 
cmdFunc = (CmdFunc);cmdFuncDAO.getObjectById(Long.valueOf(ids[i]););; 
cmdItemDAO.delCmdFuncId(cmdFunc);; 
cmdFuncDAO.deleteObjectById(Long.valueOf(ids[i]););; 
} 

} catch (MyException ex); {
    transactionManager.rollback(status);;
    throw ex;
}
transactionManager.commit(status);;


这样可以出错可以回滚证明是配置的问题。最后建议所出错信息帖出来!

good luck



你好, 自己做事务声明可以回滚!    错误就是我throw一个异常。我现在就是要清楚在错误后要能回滚!
 
0 请登录后投票
   发表时间:2005-12-05  
dwygp 写道

你好, 自己做事务声明可以回滚!    错误就是我throw一个异常。我现在就是要清楚在错误后要能回滚!


   你还是先把错误信息和配置的主要重点部分先帖出来吧!
0 请登录后投票
   发表时间:2005-12-05  
flyjie 写道
dwygp 写道

你好, 自己做事务声明可以回滚!    错误就是我throw一个异常。我现在就是要清楚在错误后要能回滚!


   你还是先把错误信息和配置的主要重点部分先帖出来吧!



## MySQL
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://132.132.100.53:3306/db_vpn?useUnicode=true&EncodingCharacter=GBK&autoReconnect=true

hibernate.connection.username usr_admin
hibernate.connection.password usr_password

###########################
### C3P0 Connection Pool###
###########################

hibernate.c3p0.max_size 20
hibernate.c3p0.min_size 3
hibernate.c3p0.timeout 1800
hibernate.c3p0.max_statements 100

#################################
### Plugin ConnectionProvider ###
#################################

hibernate.connection.provider_class net.sf.hibernate.connection.C3P0ConnectionProvider


#######################
### Transaction API ###
#######################

hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory


applicationContext.xml

   <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
		<property name="mappingResources">
            <list>				 
		<value>${po.dir}/CmdFunc.hbm.xml</value>
		<value>${po.dir}/CmdItem.hbm.xml</value> 
            </list>
        </property>
    </bean> 


    <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>


        <bean id="baseTxProxy" lazy-init="true" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
		<property name="transactionManager"> 
			<ref local="transactionManager"/> 
		</property> 
		<property name="transactionAttributes"> 
			<props>
				<prop key="*">PROPAGATION_REQUIRED</prop> 
			</props> 
		</property> 
	</bean>

	<bean id="cmdFuncDAO" class="com.syrj.dao.impl.CmdFuncDAOImpl" autowire="byName">
		<property name="persistentClass"><value>com.syrj.po.CmdFunc</value></property>
	</bean>		
	
	<bean id="cmdItemDAO" class="com.syrj.dao.impl.CmdItemDAOImpl" autowire="byName">
		<property name="persistentClass"><value>com.syrj.po.CmdItem</value></property>
	</bean>	


	<bean id="cmdFuncService" parent="baseTxProxy"> 
        <property name="target"> 
            <bean class="com.adt.service.impl.CmdFuncServiceImpl" autowire="byName" > 
				<property name="cmdItemDAO"><ref local="cmdItemDAO"/></property> 
				<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property> 
			</bean>			
        </property> 
	</bean>	
	<bean id="cmdItemService" parent="baseTxProxy"> 
		<property name="target"> 
		    <bean class="com.syrj.service.impl.CmdItemServiceImpl" autowire="byName" /> 
		</property> 
	</bean>	




Hibernate: delete from cmd_item where Id=?
Hibernate: delete from cmd_func where Id=?
13:57:26,750 ERROR ExceptionCatcherInterceptor:46 - Caught exception while invok
ing action: com.adt.action.cmd.DeleteCmdFunc@177ee02
net.sf.hibernate.HibernateException: java.sql.SQLException
        at com.adt.service.impl.CmdFuncServiceImpl.deleteCmdFunc(CmdFuncServiceI
mpl.java:56);
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method);
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39);
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25);
        at java.lang.reflect.Method.invoke(Method.java:324);
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflecti
on(AopUtils.java:284);
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJo
inpoint(ReflectiveMethodInvocation.java:155);
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:122);
        at org.springframework.transaction.interceptor.TransactionInterceptor.in
voke(TransactionInterceptor.java:56);
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:144);
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynami
cAopProxy.java:174);
        at $Proxy93.deleteCmdFunc(Unknown Source);
        at com.adt.action.cmd.DeleteCmdFunc.execute(DeleteCmdFunc.java:25);
0 请登录后投票
   发表时间:2005-12-05  
dhj1 写道
dwygp 写道
dhj1 写道
你问一下那个自称用屁股想问题的人.


也许他知道答案. 当然也可能是他在吹牛!

如果不是瞎吹牛,你的问题就有解了! 不过凶多吉少呀!

你把你的MYSQL表改为InnoDB类型,试一下看看行不行,然后告诉我结果,谢谢!

不过我认为成功的可能性还是很小,可能要手工管理Session才行!



一直用的都是InnoDB 类型呀.


程序自已管理Session,试试行不行,成功了就告诉我方法,谢谢!





你好!自己管理可以回滚呀!
0 请登录后投票
   发表时间:2005-12-05  
你的sessionFactory中加一句:

			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
					<prop key="hibernate.show_sql">true</prop>
				</props>
			</property>



事务配置这么写:
    <bean id="cmdFuncDAO" class="com.syrj.dao.impl.CmdFuncDAOImpl">
		<property name="sessionFactory">
		    <ref local="sessionFactory" />
		</property>
     </bean>

<bean id="cmdItemDAO" class="com.syrj.dao.impl.CmdItemDAOImpl">
		<property name="sessionFactory">
		    <ref local="sessionFactory" />
		</property>
     </bean>


	<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager"><ref bean="transactionManager"/></property>
        <property name="transactionAttributes">
            <props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>				
            </props>
        </property>
    </bean>

<bean id="cmdFuncService" parent="baseTxProxy"> 
<property name="target"> 
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" > 
<property name="cmdItemDAO"><ref local="cmdItemDAO"/></property> 
<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property> 
<bean> 
</property> 
</bean>


这里说明一下:property name="cmdItemDAO" 这个name是serviceImpl中声明的DAO的名字! local="cmdItemDAO"是这个配置文件中声明的DAO的实现
0 请登录后投票
   发表时间:2005-12-05  
flyjie 写道
你的sessionFactory中加一句:

			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
					<prop key="hibernate.show_sql">true</prop>
				</props>
			</property>



事务配置这么写:
    <bean id="cmdFuncDAO" class="com.syrj.dao.impl.CmdFuncDAOImpl">
		<property name="sessionFactory">
		    <ref local="sessionFactory" />
		</property>
     </bean>

<bean id="cmdItemDAO" class="com.syrj.dao.impl.CmdItemDAOImpl">
		<property name="sessionFactory">
		    <ref local="sessionFactory" />
		</property>
     </bean>


	<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager"><ref bean="transactionManager"/></property>
        <property name="transactionAttributes">
            <props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>				
            </props>
        </property>
    </bean>

<bean id="cmdFuncService" parent="baseTxProxy"> 
<property name="target"> 
<bean class="com.syrj.service.impl.CmdFuncServiceImpl" > 
<property name="cmdItemDAO"><ref local="cmdItemDAO"/></property> 
<property name="cmdFuncDAO"><ref local="cmdFuncDAO"/></property> 
<bean> 
</property> 
</bean>


这里说明一下:property name="cmdItemDAO" 这个name是serviceImpl中声明的DAO的名字! local="cmdItemDAO"是这个配置文件中声明的DAO的实现





配置都跟你给的一样了,还是不行呀.. 
0 请登录后投票
   发表时间:2005-12-05  
请各位再帮看看.. 配置文件见附近!
0 请登录后投票
   发表时间:2005-12-05  
dwygp 写道

你好, 自己做事务声明可以回滚!    错误就是我throw一个异常。我现在就是要清楚在错误后要能回滚!

你的异常必须是UnChecked Exception
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics