我是学习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]