我在 @Service 层加上 @Transactional 标签提示我 获取不到 session
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
at org.framework.core.orm.support.MapperImpl.query(MapperImpl.java:110)
at org.framework.core.orm.dao.support.AbstractBaseDaoImpl.query(AbstractBaseDaoImpl.java:23)
at org.framework.core.orm.dao.support.CommonDao.queryEntityList(CommonDao.java:49)
at org.framework.core.orm.dao.support.CommonDao.queryEntityList(CommonDao.java:39)
at org.framework.web.controller.service.ServeService.getCitys(ServeService.java:38)
at org.framework.web.controller.ServiceController.getUserList(ServiceController.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)这里是 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd "> <context:annotation-config />
<!-- 自动扫描所有注解该路径 -->
<context:component-scan base-package="org.framework" /> <context:property-placeholder location="classpath:hibernate.properties" />

<!-- DataSource Start -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${dataSource.driverClassName}" />
<property name="url" value="${dataSource.url}" />
<property name="username" value="${dataSource.username}" />
<property name="password" value="${dataSource.password}" />
</bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 扫描映射文件,实体类 -->
<property name="packagesToScan">
<list>
<value>org.framework.define.bean.entity</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dataSource.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- DataSource End -->

<!-- Transaction Start -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

    <tx:annotation-driven transaction-manager="transactionManager"  />
<!-- Transaction End -->
</beans>
Service
package org.framework.web.controller.service;import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.framework.core.orm.dao.ICommonDao;
import org.framework.define.bean.entity.City;
import org.framework.define.bean.entity.Student;
import org.framework.define.bean.result.Data;
import org.framework.define.bean.result.DataResult;
import org.framework.define.bean.result.Page;
import org.framework.define.bean.result.Result;
import org.framework.define.exception.error.support.Errors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class ServeService {

@Autowired
private ICommonDao commonDao;

public Result getCitys(HttpServletRequest request, Map<String,String> webParams){
int page = webParams.get("page")==null?1:Integer.parseInt(webParams.get("page"));

Page iPage = new Page();
iPage.setPage(page);

//List<Map<String, Object>> mapList = commonDao.queryMap("select * from city where name like ?", new Object[]{"A%"}, (page-1)*iPage.getNum(), iPage.getNum());

List<Student> list = (List<Student>) commonDao.queryEntityList("select * from student", Student.class, (page-1)*iPage.getNum(), iPage.getNum());
int totalnum = commonDao.count("select count(0) from student");

iPage.setTotalnum(totalnum);

return new DataResult(Errors.OK, new Data(list, iPage));
}
}
这是同样的代码 从家里拷到公司. 家里没问题. 但是在公司电脑 @Transactional加在Service 层就获取不到Springsession事务

解决方案 »

  1.   

    上面代码这是对的,你看看dao有没有什么问题.
      

  2.   


    我吧DAO 贴出来吧 这个是 主操作类 MapperImpl
    package org.framework.core.orm.support;import java.io.Serializable;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.framework.core.orm.IMapper;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.jdbc.Work;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;@Repository
    public class MapperImpl implements IMapper {

    @Autowired
        private SessionFactory sessionFactory;

    private final Logger log = LogManager.getLogger(MapperImpl.class);

    public Serializable create(Object paramObject) {

    return sessionFactory.getCurrentSession().save(paramObject);
    }

    public Serializable[] createAll(Collection<?> paramCollectionOfObject) {
    Serializable[] sles = new Serializable[paramCollectionOfObject.size()];
    Session session = sessionFactory.getCurrentSession();
    int i=0;
    for (Object paramObject : paramCollectionOfObject) {
    sles[i] = session.save(paramObject);
    i++;
    }
    return sles;
    }

    public void saveOrUpdate(Object paramObject) {

    sessionFactory.getCurrentSession().saveOrUpdate(paramObject);
    }

    public void saveOrUpdateAll(Collection<?> paramCollectionOfObject) {
    Session session = sessionFactory.getCurrentSession();
    for (Object paramObject : paramCollectionOfObject) {
    session.saveOrUpdate(paramObject);
    }
    }

    public void update(Object paramObject) {

    sessionFactory.getCurrentSession().update(paramObject);
    }

    public void updateAll(Collection<?> paramCollectionOfObject) {
    Session session = sessionFactory.getCurrentSession();
    for (Object paramObject : paramCollectionOfObject) {
    session.update(paramObject);
    }
    }

    public void remove(Object paramObject) {

    sessionFactory.getCurrentSession().delete(paramObject);
    }

    public void removeAll(Collection<?> paramCollectionOfObject) {
    Session session = sessionFactory.getCurrentSession();
    for (Object paramObject : paramCollectionOfObject) {
    session.delete(paramObject);
    }
    }

    public Object queryUnique(String paramString, Object[] paramArrayOfObject) { SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery(paramString);

    if(paramArrayOfObject != null) {
    for (int i = 0; i < paramArrayOfObject.length; i++) {
    sqlQuery.setString(i, String.valueOf(paramArrayOfObject[i]));
    }
    }
    return sqlQuery.uniqueResult();
    }

    public Object get(Class<?> paramClass, Serializable paramSerializable) {
    return sessionFactory.getCurrentSession().get(paramClass, paramSerializable);
    }

    public Object load(Class<?> paramClass, Serializable paramSerializable) {
    return sessionFactory.getCurrentSession().load(paramClass, paramSerializable);
    } public List<?> loadAll(Class<?> paramClass) {
    return sessionFactory.getCurrentSession().createQuery(" from " + paramClass.getName()).list();
    } public List<?> query(String paramString, Object[] paramArrayOfObject, Class<?> paramClass) { SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery(paramString);

    if(paramArrayOfObject != null) {
    for (int i = 0; i < paramArrayOfObject.length; i++) {
    sqlQuery.setString(i, String.valueOf(paramArrayOfObject[i]));
    }
    }

    sqlQuery.addEntity(paramClass);

    return sqlQuery.list();
    } @SuppressWarnings("unchecked")
    public List<Object[]> query(String paramString, Object[] paramArrayOfObject) {

    SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery(paramString);

    if(paramArrayOfObject != null) {
    for (int i = 0; i < paramArrayOfObject.length; i++) {
    sqlQuery.setString(i, String.valueOf(paramArrayOfObject[i]));
    }
    } return sqlQuery.list();
    } public List<Map<String, Object>> queryMap(final String paramString, final Object[] paramArrayOfObject) {

    final List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();

    sessionFactory.getCurrentSession().doWork(new Work() {

    @Override
    public void execute(Connection paramConnection) throws SQLException { PreparedStatement pS = paramConnection.prepareStatement(paramString);

    if(paramArrayOfObject != null) {
    for (int i = 0; i < paramArrayOfObject.length; i++) {
    pS.setString(i + 1, String.valueOf(paramArrayOfObject[i]));
    }
    }
    ResultSet rs = pS.executeQuery();

    ResultSetMetaData columns = rs.getMetaData();
    int num = columns.getColumnCount();

    while (rs.next()) {

    Map<String, Object> keyValue = new HashMap<String, Object>();

    for (int i = 1; i <= num; i++) {
    keyValue.put(columns.getColumnName(i), rs.getObject(i));
    }

    resultList.add(keyValue);
    }

    }
    });

    return resultList;
    }

    public int executeUpdate(String paramString, Object[] paramArrayOfObject) {

    SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery(paramString);

    if(paramArrayOfObject != null) {
    for (int i = 0; i < paramArrayOfObject.length; i++) {
    sqlQuery.setString(i, String.valueOf(paramArrayOfObject[i]));
    }
    }
    return sqlQuery.executeUpdate();
    }

    public int count(final String paramString, final Object[] paramObject) {

    return ((Number)queryUnique(paramString, paramObject)).intValue();

    }
    }
    还有个分页的就不贴了 
    这个是注入 Mapper 的 AbstractBaseDaoImpl
    package org.framework.core.orm.dao.support;
    import java.util.List;
    import java.util.Map;import org.framework.core.orm.IMapper;
    import org.framework.core.orm.IPage;
    import org.framework.core.orm.dao.IBaseDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Repository;@Repository
    public abstract class AbstractBaseDaoImpl<T> implements IBaseDao { @Autowired
    @Qualifier("sqlServerPage")
    private IPage page; @Autowired
    private IMapper mapper;

    protected List<?> query(String sql, Object[] params, Class<?> entity, int offset, int limit) {
    return getMapper().query(getPage().getLimitString(sql, offset, limit), params, entity);
    }

    protected List<Object[]> query(String sql, Object[] params, int offset, int limit) {
    return getMapper().query(getPage().getLimitString(sql, offset, limit), params);
    }

    protected List<Map<String, Object>> queryMap(String sql, Object[] params, int offset, int limit) {
    return getMapper().queryMap(getPage().getLimitString(sql, offset, limit), params);
    }

    public IPage getPage() { return this.page;
    } public void setPage(IPage page) {
    this.page = page;
    } public IMapper getMapper() {
    return mapper;
    } public void setMapper(IMapper mapper) {
    this.mapper = mapper;
    }}
    再然后就是 继承 AbstractBaseDaoImpl 的 CommonDao
    package org.framework.core.orm.dao.support;import java.util.List;
    import java.util.Map;
    import org.framework.core.orm.dao.ICommonDao;
    import org.springframework.stereotype.Repository;@Repository
    public class CommonDao extends AbstractBaseDaoImpl<Object> implements ICommonDao { public int count(String sql) {

    return this.count(sql, null);
    } public int count(String sql, Object[] params) {

    return getMapper().count(sql, params);
    } public int executeUpdate(String sql, Object[] params) {

    return getMapper().executeUpdate(sql, params);
    } public int executeUpdate(String sql) {

    return this.executeUpdate(sql, null);
    }
    public List<?> queryEntityList(String sql, Class<?> entity) {

    return this.queryEntityList(sql, null, entity);
    } public List<?> queryEntityList(String sql, Class<?> entity, int offset, int limit) {

    return this.queryEntityList(sql, null, entity, offset, limit);
    }

    public List<?> queryEntityList(String sql, Object[] params, Class<?> entity) {

    return getMapper().query(sql, params, entity);
    } public List<?> queryEntityList(String sql, Object[] params, Class<?> entity, int offset, int limit) {

    return super.query(sql, params, entity, offset, limit);
    }

    public List<Object[]> query(String sql) {

    return this.query(sql, null);
    } public List<Object[]> query(String sql, Object[] params) {

    return  getMapper().query(sql, params);
    } public List<Object[]> query(String sql, int offset, int limit) {

    return this.query(sql, offset, limit);
    } public List<Object[]> query(String sql, Object[] params, int offset, int limit) {

    return super.query(sql, params, offset, limit);
    } public List<Map<String, Object>> queryMap(String sql) {

    return this.queryMap(sql, null);
    } public List<Map<String, Object>> queryMap(String sql, Object[] params) {

    return getMapper().queryMap(sql, params);
    } public List<Map<String, Object>> queryMap(String sql, int offset, int limit) {

    return this.queryMap(sql, null, offset, limit);
    } public List<Map<String, Object>> queryMap(String sql, Object[] params, int offset, int limit) {

    return super.queryMap(sql, params, offset, limit);
    } public Object queryUniqueResult(String sql, Object[] params) {

    return getMapper().queryUnique(sql, params);
    } public Object queryUniqueResult(String sql) {

    return this.queryUniqueResult(sql, null);
    }}
    如果我吧 @Transactional 标注在 任意 DAO实现类 或者接口上就可以.获取到session 但是这样回归业务层就没意义了. 感觉就好像 那个@Transactional 在service 层上没起作用一样. 我的 context:component-scan路径也没错吧. 整个目录注解都包含了
      

  3.   

    serverService 调用 commonDao时候有事件,当commonDao调用MapperImpl时候事物已经丢失了,所以找不到session,要commonDao上加一个@Transactional应该就可以了。要么你就改一下代码,中间别有太多调用,因为commonDao并没有事物的传播行为特性。
      

  4.   

    结贴了,自己找到原因了. 回家用BCompare 工具比较了下~ 原来是我的 spring-servlet.xml  Spring MVC 控制器文件配置问题
    这是公司上的配置.
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd "> <context:annotation-config />
    <!-- @Controller Convert To Bean -->
    <context:component-scan base-package="org.framework.web.controller" />

    <!-- Start Spring MVC Annotation -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
    <list>
    <ref bean="messageConverters" /><!-- JSON -->
    </list>
    </property>
    </bean> <!-- Http JSON MessageConverters -->
    <bean id="messageConverters" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes">
    <list>
    <value>application/json;charset=UTF-8</value>
    </list>
    </property>

    <!-- <property name="objectMapper">
    <bean class="org.codehaus.jackson.map.ObjectMapper">
    <property name="dateFormat">
    <bean class="java.text.SimpleDateFormat">
    <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
    </bean>
    </property>
    </bean>
    </property> -->

    </bean>

    <!-- 异常捕获 -->
    <bean id="handlerExceptionResolver" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
    <property name="messageConverters" ref="messageConverters"/>
    </bean>

    <!-- 拦截器配置 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
    <list>
    <bean class="org.framework.web.controller.Interceptor.ServiceInterceptor" />
    </list>
    </property>
    </bean>

    </beans>
    这个是家里的.~ 
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd "> <context:annotation-config />
    <!-- @Controller Convert To Bean -->
    <context:component-scan base-package="org.framework.web.controller"  use-default-filters="false">
    <context:include-filter type="regex" expression="org.framework.web.controller.*Controller"/>
    </context:component-scan>

    <!-- Start Spring MVC Annotation -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
    <list>
    <ref bean="messageConverters" /><!-- JSON -->
    </list>
    </property>
    </bean> <!-- Http JSON MessageConverters -->
    <bean id="messageConverters" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes">
    <list>
    <value>application/json;charset=UTF-8</value>
    </list>
    </property>

    <!-- <property name="objectMapper">
    <bean class="org.codehaus.jackson.map.ObjectMapper">
    <property name="dateFormat">
    <bean class="java.text.SimpleDateFormat">
    <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
    </bean>
    </property>
    </bean>
    </property> -->

    </bean>

    <!-- 异常捕获 -->
    <bean id="handlerExceptionResolver" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
    <property name="messageConverters" ref="messageConverters"/>
    </bean>

    <!-- 拦截器配置 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
    <list>
    <bean class="org.framework.web.controller.Interceptor.ServiceInterceptor" />
    </list>
    </property>
    </bean>

    </beans>妈蛋呐!!!! 罪魁祸首就在那 context:component-scan 这个包路径里面,原来公司那边我没有过滤筛选掉 不是控制器的类. ~~ (奇怪的是 这样启动spring 也不报错. = =||) 然后我的 @Service 和 @Controller 放在一个包目录下. spring 就把我的@Service当成@Controller 转换了. 就是因为这个.Spring 的@Transactional 标签同 @Controller 的一起是不会开启事务的(貌似也可以配置到控制层~ 具体好像是在web.xml 配置). 所以才导致我一直 没有事务.. 结贴结贴!! 辛苦自己了.大家以后也注意注意下~