论坛首页 Java企业应用论坛

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

浏览 23349 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-12-05  
DAO
软件环境:
tomcat 5.0+ spring + hibernate
配置文件:
<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.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" />
        </property>
</bean>




public void deleteCmdFunc(String[] ids) throws HibernateException {
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]));
}
}
错误提示信息:
cmdFuncDAO出错后,  cmdItemDAO的操作没有回滚!
你的分析:
都是同一数据源! 请问该怎么配置呀?
   发表时间:2005-12-05  
dwygp 写道
错误提示信息:
cmdFuncDAO出错后,  cmdItemDAO的操作没有回滚!
你的分析:
都是同一数据源! 请问该怎么配置呀?


数据库是什么,不支持事务的mysql normal table?
0 请登录后投票
   发表时间:2005-12-05  
数据库是: mysql  v 4.1.14-standard
0 请登录后投票
   发表时间:2005-12-05  
dhj1 写道
看这贴: "SERVICE层不能相互调用"

http://www.hibernate.org.cn/viewtopic.php?t=16460

所导致的原因应该是相同的.

不过有人用屁股想想都是可以的,而且你的是同数据源,更应该可以,你为什么不可以?!



不知道该怎么配置了...
0 请登录后投票
   发表时间:2005-12-05  
Readonly 写道
dwygp 写道
错误提示信息:
cmdFuncDAO出错后,  cmdItemDAO的操作没有回滚!
你的分析:
都是同一数据源! 请问该怎么配置呀?


数据库是什么,不支持事务的mysql normal table?




数据库是mysql  4.1.14-standard
怎么知道它支持不支持事务呀?
0 请登录后投票
   发表时间:2005-12-05  
dwygp 写道

数据库是mysql  4.1.14-standard
怎么知道它支持不支持事务呀?

去查mysql的文档啊,从4.0开始mysql用InnoDB作为默认的table type,是支持事务的,除非你设置了skip-innodb,用mysql提供的工具检查一下对应的table type,看看是什么类型就知道了。
0 请登录后投票
   发表时间:2005-12-05  
Readonly 写道
dwygp 写道

数据库是mysql  4.1.14-standard
怎么知道它支持不支持事务呀?

去查mysql的文档啊,从4.0开始mysql用InnoDB作为默认的table type,是支持事务的,除非你设置了skip-innodb,用mysql提供的工具检查一下对应的table type,看看是什么类型就知道了。



类型都用的是InnoDB.
0 请登录后投票
   发表时间:2005-12-05  
dhj1 写道
你问一下那个自称用屁股想问题的人.


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

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

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

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



一直用的都是InnoDB 类型呀.
0 请登录后投票
   发表时间:2005-12-05  
dwygp 写道
一直用的都是InnoDB 类型呀.

那么肯定是你其他地方配置错了,贴上完整的配置文件,代码,和出错信息看看
0 请登录后投票
   发表时间:2005-12-05  
Readonly 写道
dwygp 写道
一直用的都是InnoDB 类型呀.

那么肯定是你其他地方配置错了,贴上完整的配置文件,代码,和出错信息看看





## 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.syrj.service.impl.CmdFuncServiceImpl" autowire="byName" />
</property>
</bean>
<bean id="cmdItemService" parent="baseTxProxy">
<property name="target">
    <bean class="com.syrj.service.impl.CmdItemServiceImpl" autowire="byName" />
</property>
</bean>


CmdFuncServiceImpl.java
...

public void deleteCmdFunc(String[] ids) throws HibernateException {
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]));
if(i==3){
throw new HibernateException("测试异常事务处理");
}
}
}

...
0 请登录后投票
论坛首页 Java企业应用版

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