zjian0573 2009-10-14 18:01
浏览 263
已采纳

spring使用声明事务不能回滚,请帮我看下原因

初学spring,编写一个事务的例子,但是不能回滚。代码如下
spring配置文件
[code="java"]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">




classpath:config.properties

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">
        <value>${datasource.driverClassName}</value>
    </property>
    <property name="url">
        <value>${datasource.url}</value>
    </property>
    <property name="username">
        <value>${datasource.username}</value>
    </property>
    <property name="password">
        <value>${datasource.password}</value>
    </property>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <ref local="dataSource" />
    </property>
</bean>

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref local="transactionManager"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="addUser">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean> 

<bean id="userDao" class="cn.com.home.dao.jdbc.UserDao" autowire="byName"></bean>
<bean id="userServiceTarget" class="cn.com.home.service.UserService" autowire="byName"></bean>
<bean id="userService" parent="txProxyTemplate" >
    <property name="target"><ref local="userServiceTarget"/></property>    
</bean>

[/code]

dao代码
[code="java"]
public class UserDao {
private JdbcTemplate jdbcTemplate;

/**
 * @param jdbcTemplate
 *            the jdbcTemplate to set
 */
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}   

/**
*
* @param user
*/
public void save(User user) throws DatabaseException {
String sql = "insert into t_user (id,name,sex,age,city) values (?,?,?,?,?)";
Object[] params = new Object[] { user.getId(), user.getName(),
user.getSex(), user.getAge(), user.getCity() };
try {
jdbcTemplate.update(sql, params);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new DatabaseException(e);
}
}

}
[/code]
service代码
[code="java"]
public class UserService{

private UserDao userDao;

/**
 * @param userDao
 *            the userDao to set
 */
public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}

/**
 * @throws Exception
 * 
 */
public void addUser() throws DatabaseException {
    User u = new User();
    u.setId(Long.valueOf(123));
    u.setName("张三");
    u.setAge(20);
    u.setSex("男");
    u.setCity(571);
    userDao.save(u);
    User u2 = new User();
    u2.setId(Long.valueOf(123));
    u2.setName("李四");
    u2.setAge(20);
    u2.setSex("男男男男男男男男男男男男男男男男男男男男男男男男男男");
    u2.setCity(571);
    userDao.save(u2);

}

/**
 * @param args
 */
public static void main(String[] args) {
    BeanFactory bf = new ClassPathXmlApplicationContext(
            "spring/applicationContext.xml");
    UserService service = (UserService) bf.getBean("userService");
    try {
        service.addUser();
    } catch (DatabaseException e) {

    }
}

}
[/code]

第二个user的sex故意设置成超过数据库字段长度的值,故意是inser出错。
但是为什么 这个事务没有回滚呢? 结果是第一个user插入到了数据库中。应该是两个都没有提交的。

  • 写回答

3条回答 默认 最新

  • wanghaolovezlq 2009-10-14 18:55
    关注

    自己看看你配置的





    PROPAGATION_REQUIRED

    没有配置回滚策略嘛,所以使用默认的回滚策略

    [color=red]默认的回滚策略:
    任何RuntimeException将触发事务回滚,但是任何checked Exception将不触发事务回滚[/color]

    你定义的那个throw new DatabaseException(e);这个异常应该是checked Exception吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿