简单了解Spring中的事务控制
Spring作为一款优秀的 Java 开发框架,提供了非常完善的数据访问和事务控制支持。Spring 的事务控制主要是通过AOP(面向切面编程)实现,易于扩展,功能强大。
什么是事务
事务是指一组要么全部执行成功,要么全部回滚的一组数据库操作。在Java应用程序中,事务的支持是非常重要和必要的,会话中出现故障或意外错误时,可以防止数据损坏或不一致情况的发生。
Spring的事务控制
Spring的事务控制非常简单,主要使用@Transactional
注解,支持非常多的配置。下面列举一些常用操作和配置。
1. 开启事务
在要进行事务控制的方法上面添加@Transactional
注解即可开启事务控制。如下所示:
@Transactional
public void addSomeData() {
// 操作数据库
}
2. 声明事务的传播特性
事务的传播特性是指:当一个事务方法(声明了@Transaction注解)被另一个事务方法调用时,如何处理事务。
常用的传播特性如下:
PROPAGATION_REQUIRED
:支持当前事务,如果不存在则创建新事务。PROPAGATION_SUPPORTS
:支持当前事务,如果不存在则不使用事务。PROPAGATION_MANDATORY
:支持当前事务,如果不存在则抛出异常。PROPAGATION_REQUIRES_NEW
:创建新事务,如果当前存在事务则挂起。PROPAGATION_NOT_SUPPORTED
:以非事务方式运行,如果存在事务则挂起。PROPAGATION_NEVER
: 以非事务方式运行,如果存在事务则抛出异常。PROPAGATION_NESTED
:如果当前事务存在,则在嵌套事务内执行。如果当前事务不存在,则和 PROPAGATION_REQUIRED 行为相同。
使用示例如下:
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something else
}
在该示例中,methodB()
被methodA()
调用。methodA()
声明了传播特性为PROPAGATION_REQUIRED
,methodB()
的传播特性为PROPAGATION_REQUIRES_NEW
。这意味着,当执行 methodB()
时,Spring 将先暂停执行(methodA()
中的事务),然后再开启一个新的事务并执行methodB()
。
3. 设置事务超时时间
可以通过@Transactional
注解的timeout
属性设置事务超时时间,单位是秒。如下所示:
@Transactional(timeout = 30)
public void someMethod() {
// do something
}
在该示例中,someMethod()
的事务超时时间为30秒。
事务控制的注意事项
@Transactional
注解只能应用于公共方法。- 不要让事务方法抛出异常,这可能会导致事务回滚。如果必须抛出异常,请将异常转换为 Spring 异常。
- Spring默认将捕获
RuntimeException
和Error
来回滚事务。 - 默认情况下,Spring的事务控制仅回滚未受检查异常。如果你要让事务回滚所有异常,则需要在
@Transactional
注解上添加rollbackFor
属性。
示例
以下是一个简单的Spring事务控制示例,用于向数据库中插入用户信息:
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void saveUser(User user) throws Exception {
userDao.save(user);
if(user.getName().equals("admin")) {
throw new Exception("用户名不能是admin!");
}
}
}
在该示例中,saveUser()
方法声明了传播特性为PROPAGATION_REQUIRED
,并设置了rollbackFor
属性来让事务在抛出异常时回滚。
在执行saveUser()
时,如果插入的用户信息的名称是admin
,则会抛出异常,事务将回滚,数据不会插入到数据库中。
@Service
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/saveUser")
public String saveUser(User user) {
try {
userService.saveUser(user);
} catch (Exception e) {
return "error";
}
return "success";
}
}
在该示例中,UserController
调用UserService
的saveUser()
方法,如果插入过程中出现异常,则返回错误信息;否则返回success
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单了解Spring中的事务控制 - Python技术站