????????声明式事务的实现很简单,只需要在需要事务的?法上添加 @Transactional 注解就可以实现了.?需?动开启事务和提交事务,进??法时?动开启事务,?法执?完会?动提交事务,如果中途发?了 没有处理的异常会?动回滚事务.
? ? ? ? 废话不多说,直接看代码实现,可以更直观的学习
? ? ? ? 代码没有截取全,只截取了最核心的代码,其中?userService 对象调用?insertUser 方法可以向数据库中插入数据,知道这个即可
? ? ? ? 在?registry() 方法前添加?@Transactional 注解,为方法创建事务
? ? ? ???registry() 方法中的代码都正常运行,没有抛出错误,此时事务正常提交
@Transactional
@RequestMapping("/registry")
public String registry(String userName,String password){
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
return "注册成功";
}
? ? ? ? 如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作
??????????registry1() 方法中?int a=10/0; 这行代码是错误的,所以方法??registry1() 会抛出错误,此时事务就会自动进行回滚
@Transactional
@RequestMapping("/registry1")
public String registry1(String userName,String password){
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
int a=10/0;
return "注册成功";
}
????????如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作
????????registry2() 方法中?int a=10/0; 这行代码是错误的,但是错误被捕获并进行了处理,此时方法registry2() 就不会向外抛出错误,那么事务就不会回滚,而是自动提交
? ? ? ? 通过这里我们可以看出,事务是以方法为一个整体,并不关心方法中执行的程序有没有错误,只关心方法有没有抛出错误,方法没有抛出错误就自动提交,抛出错误就回滚(但不是所有的错误都回滚,后面会举例)
@Transactional
@RequestMapping("/registry2")
public String registry2(String userName,String password){
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
try {
int a=10/0;
}catch(Exception e){
log.info("发生错误");
}
return "注册成功";
}
????????如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作
? ? ? ? 上述事务的提交和回滚都是自动的,当然也可以手动的进行回滚
????????使? TransactionAspectSupport.currentTransactionStatus() 得到当前的事务,并调用?setRollbackOnly() 进行回滚
@Transactional
@RequestMapping("/registry3")
public String registry3(String userName,String password){
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
try {
int a=10/0;
}catch(Exception e){
//手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return "注册成功";
}
????????如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作
? ? ? ? 上面的例子中有提到,不是所有的错误被抛出都会回滚,实际上,默认情况下只有抛出RuntimeException 以及它的子类或?Error 的错误才会回滚
? ? ? ? 如下代码,手动抛出了一个?IOException() 异常,IOException() 异常不属于?RuntimeException 的子类,所以事务不会回滚,会直接提交
@Transactional
@RequestMapping("/registry4")
public String registry4(String userName,String password) throws IOException {
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
try {
int a=10/0;
}catch(Exception e){
throw new IOException();
}
return "注册成功";
}
????????如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作