SpringMVC支持声明式和编程式事务管理,这里我讲的是声明式事务,也即通过注解@Transactional来使用事务。
这里是我在这个工程中所使用的jar包:http://download.csdn.net/detail/liujan511536/9050079
这里是我这个工程的源码:http://download.csdn.net/detail/liujan511536/9050093
SpringMVC_Mybatis
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:mybatis-context.xml
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:application-context.xml
1
springmvc
*.html
classpath:db-config.properties
application-context.xml (/WebContent/WEB-INF/classes/目录下):
classpath:db-config.properties
@Transactional(propagation=Propagation.REQUIRED)
public void saveUser(User u) throws Exception{
userMapper.insert(u);
throw new RuntimeException("hehe");
}
当运行这个函数时,是先往数据库中插入数据u,然后再抛出RuntimeException异常,而且这个异常没有被saveUser函数捕捉,所以这个异常会被Spring检测到,这时事务就会回滚,数据插入失败;
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public void saveUser(User u) throws Exception{
userMapper.insert(u);
try {
throw new RuntimeException("hehe");
} catch (Exception e) {
// TODO: handle exception
}
}
public void addUser(String name, int stuId) {
User u = new User();
u.setName(name);
u.setStuid(stuId);
try {
userService.saveUser(u);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
这时事务也会回滚。
@Transactional(propagation=Propagation.REQUIRED)
public void saveUser(User u) throws Exception{
userMapper.insert(u);
throw new Exception("hehe");
}
这时事务是不会回滚的。
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public void saveUser(User u) throws Exception{
userMapper.insert(u);
throw new Exception("hehe");
}
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。