大厂面试题:读过Spring源码吗?说说Spring事务是怎么实现的?

创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家!


什么是数据库事务

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

简单来说: 事务是逻辑上的一组操作,要么都执行,要么都不执行。

通过事务,至少可以实现2点:

1)操作的原子性

2)数据一致性。

我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的 savePerson() 方法中就有两个原子性的数据库操作。

这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。

public void savePerson() {
  personDao.save(person);
  personDetailDao.save(personDetail);
}

事务就是保证这两个关键操作要么都成功,要么都要失败。 最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账 1000 元,这个转账会涉及到两个关键操作就是:

1. 将小明的余额减少 1000 元。
2. 将小红的余额增加 1000 元。

万一在这两个操作之间突然出现错误比如银行系统崩溃或者网络故障,导致小明余额减少而小红的余额没有增加,这样就不对了。

public class OrdersService {

  private AccountDao accountDao;

  public void setOrdersDao(AccountDao accountDao) {
    this.accountDao = accountDao;
  }

 @Transactional(propagation = Propagation.REQUIRED,
                isolation = Isolation.DEFAULT, readOnly = false, timeout = -1)
 public void accountMoney() {
    //小红账户多1000
    accountDao.addMoney(1000,xiaohong);
    //模拟突然出现的异常,比如银行中可能为突然停电等等
    //如果没有配置事务管理的话会造成,小红账户多了1000而小明账户没有少钱
    int i = 10 / 0;
    //小明账户少1000
    accountDao.reduceMoney(1000,xiaoming);
  }
}
数据库事务的 ACID 四大特性

数据库事务的 ACID 四大特性是事务的基础,下面简单来了解一下。

事务的执行具备四大特征:

1Atomic 原子性

事务必须是一个原子的操作序列单元,事务中包含的各项操作在一次执行过程中,要么全部执行成功,要么全部不执行,任何一项失败,整个事务回滚,只有全部都执行成功,整个事务才算成功。

2Consistency 一致性

事务的执行不能破坏数据库数据的完整性和一致性,事务在执行之前和之后,数据库都必须处于一致性状态。

3Isolation 隔离性

在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。

即不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。

4Durability 持久性

持久性(durability):持久性也称永久性(permanence

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏日彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值