spring 事务没有回滚

我是学习spring新手, 碰到spring事务没有回滚的问题, 希望知道原因的指教,不胜感激:

我在mysql里建了一个测试的admin表(innoDB 类型), 只有id一个字段(整形)。
4条数据:
id
1
2
3
4

配置文件:
[code="java"]
class="com.jandar.fdpweb.action.system.BranchOperationAction">


class="com.jandar.fdpweb.service.system.BranchManage">



class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">


    <property name="target">
        <ref local="branchDao"/>
    </property>

    <property name="transactionAttributes">
        <props>
            <prop key="deleteTest">PROPAGATION_REQUIRED, -Exception</prop>
        </props>
    </property>     

class="com.jandar.fdpweb.dao.jdbc.system.BranchDaoJdbcImpl">



class="org.springframework.jdbc.core.JdbcTemplate">



class="org.springframework.jdbc.datasource.DataSourceTransactionManager">





com.mysql.jdbc.Driver


jdbc:mysql://localhost:3306/cjr_test?characterEncoding=utf8


root


123456

10
5
20
5
60
0

[/code]

Struts Action 类:

[code="java"]
public class BranchOperationAction extends DispatchAction {

private BranchManage branchManage;

public BranchManage getBranchManage() {
    return branchManage;
}

public void setBranchManage(BranchManage branchManage) {
    this.branchManage = branchManage;
}

public ActionForward delete(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
{

        ActionForward forward = new ActionForward();
        DynaActionForm modifyForm = (DynaActionForm) form;          
        String branchId = modifyForm.getString("branch_tj").trim();
        branchManage.deleteTest(branchId);
        forward = mapping.findForward("success");
        return (forward);
}

}
[/code]

Server 类:

[code="java"]
public class BranchManage {
private BranchDao branchTransaction;

public BranchDao getBranchTransaction() {
    return branchTransaction;
}

public void setBranchTransaction(BranchDao branchTransaction) {
    this.branchTransaction = branchTransaction;
}

public void deleteTest(String branchId) {
    branchTransaction.deleteBranch(branchId);
}

}
[/code]

DAO 类:

[code="java"]
public interface BranchDao {
public void deleteBranch(final String branchId);
}

public class BranchDaoJdbcImpl implements BranchDao {
private JdbcTemplate jdbcTemplate;

public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}
public void deleteBranch(final String branchId) {
    String sqlDelete1 = "delete from admin where id = 1"; // 先删除一条记录
    int[] arr = {1, 2, 3, 4};   
    jdbcTemplate.update(sqlDelete1); 
            //我调试时, 程序运行这行后, 数据库居然删了一行, 事务这时应该没提交,不会删数据库才对啊, 是这样吗?
            //数组下标越界,想让程序抛出Runtime Exception  
    String sqlDelete2 = "delete from admin where id = " + arr[5]; 
    jdbcTemplate.update(sqlDelete2); // 删除第二条报错,事务没有回滚
}

}
[/code]

0

3个回答

你配置错误
你是针对dao来配置事务的
那自然就应该写成这样

PROPAGATION_REQUIRED, -Exception

0

你的c3p0DataSource数据源没有关闭默认自动提交吧。
增加

0

你的传播特性应该配置方法 正如2楼写的那样,spring的局部事务,实质是事务管理与aop的结合,它是通过factorybean的形式 取得它处理完的对象。在org.springframework.transaction.interceptor.TransactionProxyFactoryBean中,把你注入的



PROPAGATION_REQUIRED, -Exception



是通过
this.transactionInterceptor.setTransactionAttributeSource(transactionAttributeSource);实现的 也就是说 是把你传入的方法进行了aop的代理,才会在代码里横切进去事务的。你可以看看这段的源代码,会有很大收获的

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!