0 0

spring+mybatis,事务不起作用,求帮忙0

spring + mybatis,开始annotation式事务
配置如下:
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.user}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxIdle" value="60" />
        <property name="maxActive" value="100" />
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>
   
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

在Service层使用@Transactional,Service没有用接口
    @Transactional
    public void registerAccount(Account account, String email, Long classId) {
      try {
            addAccount(account);
            AccountDetail accountDetail = new AccountDetail(accountId);
            accountDetail.setEmail(email.trim());
            addAccountDetail(accountDetail);
            addAccountToClass(accountId, classId);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new RuntimeException(e.getMessage());
        }
    }

三个add*方法都是private方法,没有try catch块。当addAccountToClass方法抛错时,会在当前这个try catch块中被捕获,并抛出RuntimeException。但是,前面的两个add方法却没有回滚,谁知道是怎么回事?

log日志如下:
[DEBUG] 2013-09-03 08:51:48oo Using Connection [jdbc:mysql://localhost:3306/test, UserName=root@localhost, MySQL-AB JDBC Driver]
[DEBUG] 2013-09-03 08:51:48 :==>  Preparing: select * from account where name = ?;
[DEBUG] 2013-09-03 08:51:48 :==> Parameters: uuux(String)
[DEBUG] 2013-09-03 08:51:48oo Using Connection [jdbc:mysql://localhost:3306/test, UserName=root@localhost, MySQL-AB JDBC Driver]
[DEBUG] 2013-09-03 08:51:48 :==>  Preparing: insert into tbl_account (password, name, gender) values (?, ?, ?);
[DEBUG] 2013-09-03 08:51:48 :==> Parameters: 81dc9bdb52d04dc20036dbd8313ed055(String), uuux(String), 0(Integer)
[INFO ] 2013-09-03 08:51:48 :创建新用户uuux
[DEBUG] 2013-09-03 08:51:48oo Using Connection [jdbc:mysql://localhost:3306/test, UserName=root@localhost, MySQL-AB JDBC Driver]
[DEBUG] 2013-09-03 08:51:48 :==>  Preparing: insert into tbl_account_detail (account_id, email, age) values (?, ?, ?);
[DEBUG] 2013-09-03 08:51:48 :==> Parameters: 20(Long), ds@s.s(String), null
[INFO ] 2013-09-03 08:51:48 :创建新用户详情
[DEBUG] 2013-09-03 08:51:48oo Using Connection [jdbc:mysql://localhost:3306/test, UserName=root@localhost, MySQL-AB JDBC Driver]
[DEBUG] 2013-09-03 08:51:48 :==>  Preparing: insert into tbl_account_class_ref (account_id, class_id) values (accountId, ?);
[DEBUG] 2013-09-03 08:51:48 :==> Parameters: 1(Long)
[INFO ] 2013-09-03 08:51:48 :Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
[INFO ] 2013-09-03 08:51:48 :SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
[ERROR] 2013-09-03 08:51:48 :
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'accountId' in 'field list'
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: insert into tbl_account_class_ref (account_id, class_id) values (accountId, ?);
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'accountId' in 'field list'

这里我觉得比较奇怪的一点事:日志中打印了多个ooo Using Connection [jdbc:mysql://localhost:3306/test,... 是不是意味着每个操作都用了一个单独的连接?
2013年9月03日 09:02

7个答案 按时间排序 按投票排序

0 0

这里事务不起作用的原因是:在SERVICE里进行了异常扑捉,请放到外面的方法中进行异常的处理

2013年9月04日 14:03
0 0

事务的service层必须面向接口编程,如:

@Component
public class TestServiceImpl implements TestService{ 

....


@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
public void scanner(Integer shiftWork)throws Exception {

    }

......

}

2013年9月03日 17:48
0 0

如果楼主用的是mySql
请参考:http://blog.csdn.net/zhangdaiscott/article/details/8203807

2013年9月03日 15:49
0 0

发一下你的事务是怎么配置的

2013年9月03日 12:28
0 0

AopUtils.isCglibProxy(object)查看对象是否被cglib代理;
mysql引擎是否为InnoDB;
最后看看是不是因为多个spring扫描文件覆盖问题。

2013年9月03日 12:08
0 0

请确认事务与逻辑注解扫描在同一个容器里,这样才能保证事务的正常开启。(例如:误将注解都扫描在web容器,但是web容器没有配置事务,事务是配置在逻辑容器里,这样导致事务没有开启)。可以把注解扫描代码贴出来! 

2013年9月03日 10:50
0 0

可以参考下我的博文:http://angelbill3.iteye.com/blog/1896502

2013年9月03日 09:27

相关推荐

Global site tag (gtag.js) - Google Analytics