我想通过事务超时配置来让系统自动回滚长事务处理,解决长事务带来的系统性能问题,
系统框架:Struts1+spring1.2+hibernate3,
运行环境:win2003+websphere6+sqlserver2000。我在applicationContext.xml里配置事务超时的地方:
<prop key="update*">PROPAGATION_REQUIRED,timeout_5,ISOLATION_READ_COMMITTED</prop>我先在应用系统中查出要修改的记录,然后我在sqlserver的查询分析器中,用
begin transaction
update roletype='11' where roletypecode='CEO'
--rollback transaction
按主键把应用系统中要修改的那条记录锁住然后在应用系统中修改这条数据,正常的结果应该是,超过5秒后会返回超时异常。我测试的结果是在dao中用JdbcTemplate的excute执行数据库操作时,spring的事务超时配置起作用,但用hibernate方式操作数据库,spring的事务超时配置不起作用,难道是还有什么地方需要配置吗?请各位高手解答。以下是相关代码:dao实现类:
public class BaseDAO    extends HibernateDaoSupport    implements DAO
{  private Session session;  private DataSource dataSource; //dataSource用于直接jdbc查询。  public Serializable create(Object obj)
  {
    return getHibernateTemplate().save(obj);
  }  public void update(Object obj)
  {
    getHibernateTemplate().saveOrUpdate(obj);
  }  public void delete(Object obj)
  {
    getHibernateTemplate().delete(obj);
  }  public Object load(Class entityClass, Serializable id)
  {
    Object obj = null;
    try
    {
      obj = getHibernateTemplate().load(entityClass, id);
    }
    catch (Exception e)
    {
    }
    return obj;
  }  public Object get(String className, Serializable id)
  {
            Object obj = null;
            try
            {
              obj = getHibernateTemplate().get(className, id);
            }
            catch (Exception e)
            {
            }
            return obj;
  }  public Object get(Class entityClass, Serializable id)
  {
            Object obj = null;
            try
            {
              obj = getHibernateTemplate().get(entityClass, id);
            }
            catch (Exception e)
            {
            }
            return obj;
  }
  
  public void evict(Object entity)
  {
    getHibernateTemplate().evict(entity);
  }
  
  public List query(String hsql)
  {
    return getHibernateTemplate().find(hsql);
  }  public List queryWithJDBC(String sql)
  {
    JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
    return jTemplate.queryForList(sql);
  }  public List queryWithJDBC(String sql,Class elementType)
  {
    JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
    return jTemplate.queryForList(sql,elementType);
  }  /**
   *用于执行select count(*)方法
   */
  public int queryForInt(String sql)
  {
    JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
    return jTemplate.queryForInt(sql);
  }  /**
   *用于执行方法
   */
  public void excute(String sql)
  {
    JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
    jTemplate.execute(sql);
  }  public DataSource getDataSource()
  {
    return dataSource;
  }  public void setDataSource(DataSource dataSource)
  {
    this.dataSource = dataSource;
  }  public Criteria createCriteria(Class entity)
  {
    session = getSession(true);
    return session.createCriteria(entity);
  }  public void closeSession()
  {
    closeSessionIfNecessary(session);
  }  public HibernateTemplate getHTemplate()
  {
    return getHibernateTemplate();
  }
  
  public void refresh(Object obj){
          getHibernateTemplate().refresh(obj);
  }  public void flush(){
          getHibernateTemplate().flush();
  }
}用以上DAO类中的create,update,delete方法操作数据库,事务超时就不起作用

解决方案 »

  1.   

    看看你是spring配置文件中的事务的传播特性 对不对
      

  2.   

    <prop key="update*">PROPAGATION_REQUIRED,timeout_5,ISOLATION_READ_COMMITTED</prop>没错吧,在update方法里用Dao.excute(sql)执行就起作用,用Dao.update(Object obj)就不起作用
      

  3.   

    spring事务是否管理了hibernate ?如果没有,那肯定不会起作用了
      

  4.   

    已经配置spring事务管理Hibernate了,而且hibernate方式操作的事务都是起作用的,如下是配置内容:<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="resourceRef">
    <value>true</value>
    </property>
    <property name="jndiEnvironment">
    <props>
    <prop key="java.naming.factory.initial">
    com.ibm.websphere.naming.WsnInitialContextFactory
    </prop>
    </props>
    </property>
    <property name="jndiName">
    <value>UPSDataSource</value>
    </property>
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref local="dataSource" />
    </property>
    <property name="configLocation">
    <value>ups.hibernate.cfg.xml</value>
    </property>
    </bean>

    <!--数据库的事务管理器
    -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>
    <!-- 数据库的事务拦截的方法名配置 
    -->
    <bean id="txAttributes" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
    <property name="properties">
    <props>
    <!-- normal -->
    <prop key="set*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
    <prop key="insert*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
    <prop key="update*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
    <prop key="save*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
    </props>
    </property>
    </bean>

    <!-- 数据库的事务拦截器配置 
    -->
    <bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
    <ref local="transactionManager" />
    </property>
    <property name="transactionAttributeSource">
    <ref bean="txAttributes" />
    </property>
    </bean>

    <!-- 数据库的事务代理配置 
    -->
    <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
    <list>
    <value>txInterceptor</value>
    </list>
    </property>
    <property name="beanNames">
    <list>
      <value>systemSet</value>
      <value>applyManage</value>
    </list>
    </property>
    </bean>