事务管理
- 特性
- 原子性
- 一致性
- 隔离性
- 持久性
事务概念
- 事务本质
事务,是一系列的数据库操作,它们要么都全部成功,要么全部都失败,不允许部分成功或者部分失败 - 事务传播行为
举个例子,考虑到一个电商网站的订单处理系统,当顾客下订单时,系统可能需要在多个不同的方法中,执行不同的操作,比如创建订单,扣款,更新库存等,事务的传播行为定义了这些方法之间1事务的传播方式,如果在扣款操作中发生了错误,事务可以回滚以确保订单和库存不会受到影响 - 事务隔离级别
假设有俩个银行客户同时尝试在同一个账户上执行存款和取款操作,事务隔离级别决定了一个客户的操作是否会对另一个客户的操作产生影响。如果隔离级别设置了SERIALIZABLE,那么一位客户的操作必须要等到另一位客户的操作完成后才能执行,以避免冲突和不一致性 - 事务超时时间
考虑一个在线预定系统,当客户选择做位并进行预定时,事务可能需要在一定时间内完成,如果没有在规定的时间内完成,那么系统可以将事务回滚,以便其他用户可以预定相同的座位,这里可以参考电影院软件 - 只读事务
这里考虑新闻发布系统,只读事务可以用于查看文章,因为这个不需要修改数据,只读事务可以并发运行,不会锁定数据,可以提高系统的性能
@Transactional(readOnly = true)
public List<Product> getAllProducts() {
// 该方法只执行读取操作,不会修改数据库内容
return productRepository.findAll();
}
-事务回滚规则
假设一个在线支付系统,如果你支付失败,需要触发事务回滚,以便你的金额不会被扣除,在这里,你支付失败的异常就可以定义会事务回滚的规则
实现事务管理
这里强调一点,spring的事务管理其实是aop的一种特殊的应用
- 事务是一系列数据库操作,要么全部成功执行,要么全部失败回滚
- 在应用程序中确保数据一致性和完整性的一个重要方面是事务管理
- spring中有俩种,一种声明性事务,一种是编程性事务
具体用法
- 1.在spring中,使用
@Transactional
注解来声明式的管理事务 - 2.在一个方法上添加
@Transactional
注解时,springAop会拦截该方法的调用,并在其方法调用前后启动和提交事务 - 3.如果方法在执行期间发生异常,aop会回滚事务,确保数据的一致性
编程式事务管理:通过编写代码,使用platfromtranctionmanager接口的实现来启动,提交或回滚事务
private userDao userDao;
private PlatformTransactionManager transactionManager;
@Autowired
public userServiceImpl(userDao userDao, PlatformTransactionManager transactionManager) {
this.userDao = userDao;
this.transactionManager = transactionManager;
}
public userServiceImpl() {
}
public void add(user user) {
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
try {
gg();
transactionManager.commit(status);
System.out.println("用户添加成功");
} catch (Exception e) {
transactionManager.rollback(status);
System.out.println("用户添加失败:" + e.getMessage());
}
}
public void gg(){
for (int i = 0; i < 10; i++) {
user user = new user();
user.setName("liaoyi");
user.setAge(i);
userDao.add(user);
if(i==5){
throw new RuntimeException("报错了");
}
}
}
声明式事务