spring事务

本文详细解析了Spring事务管理机制,介绍了事务的基本概念及其四大特性:原子性、一致性、隔离性和持久性,并通过具体案例阐述了这些特性的含义。此外,还讨论了事务的不同传播行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring事务

事务

在逻辑上的一组操作,组成这个操作的各个逻辑单元(某一个controller中所调用的所有方法)。

事务4种特性(ACID)

1、原子性(atomicity):

​ 事务的不可分割,在一组操作中要么全部执行,要么全都不执行。实现事务的原子性就必须支持回滚操作,回滚后回到事务执行前的状态。

​ 举个栗子:例如在银行跨行转账过程中,A、B各拥有100元,现A要转账50元给B,正常的流程可能是:

1、A所在的银行吧A账户减去50

2、A所在的银行通知B所在的银行对B账户增加50元

3、B所在的银行把B账户增加50元。

​ 正常流程下这样做是没问题的,但是如果在第二步骤的时候报错了,事务在没有原子性的情况加A就是损失50元,这时B账户并没有收到这笔钱。

2、一致性(consistency):

​ 事务执行前后,数据保持完整性一致(数据库从一个一致状态变为另一个一致状态),一致性的体现不仅仅要站在数据库的角度允许数据的完整性,在逻辑上也要保持。

举个栗子:在商品售卖的情景中,某个商品卖出一件时他的库存量就相应减一,但是当商品的库存量为0时,在我们理解中是不允许进行售卖的,但是这个负值在数据库中存在是没有问题的,这时就要在程序中进行控制,避免商品的超卖情况。这也就保持了逻辑上的一致性。一致性单靠数据库是无法完成的。

3、隔离性(isolation):

​ 指并发事务中每个事务之间的相互影响。隔离性是为了解决并发事务可能出现的三种问题:

  • 脏读:一个事务读到了另一个事务未提交(或回滚前)的数据(不同事务之间的影响)。

    举个栗子:当A、B同时在超市买东西时候,此时货架上有一个苹果,A将苹果放到了自己的购物车中(不去结账),此时B也来了想买苹果,但是此时B看到货架上已经没有苹果了,后来A因为某种原因又将苹果放了回去,超市的苹果还是没有卖出去。

    由于A、B每个人的整个购物过程(挑选东西放进购物车—>结帐付款)都算是一个事务,A在没有结账购买之前B所看到的都是脏读。

  • 不可重复读:在同一事务内,对同一数据的多次查询过程中,由于读到了另一个事务对该数据的update、delete导致了多次的查询结果不一致。

    举个栗子:A在超市买东西,路过卖茅台酒的时候发现货架上还有一瓶,想等会再来拿上,但此时超市管理员C发现这瓶茅台酒过期了,就把这瓶酒给下架了,当A再来拿的时候,发现茅台酒没了。

    把A从进超市到结账走看作同一个事务,管理员下架(delete)这瓶酒也是一个事务。这两个事务之间的影响就出现了不可重复读

  • 幻读:在同一事物内对同一个表进行多次读取数据的过程中,另一个事务在该表中insert了一条数据,导致多次查询结果不一致。

    举个栗子:A这次去超市买茅台酒,发现货架上还是没有,转身又去买了瓶青岛,但是在这过程中,管理员C搬来了一箱飞天茅台放上了货架,A结账路过时以为自己出现了幻觉看到了一箱飞天茅台。

    把A从进超市到结账走看作同一个事务,管理员上架(insert)飞天茅台也是一个事务。insert就对A的事务产生了幻读的影响

    幻读和不可重复读的区别在于,不可重复读是另一个事务发生update、delete,幻读是另一个事务发生insert

    为了解决以上三个问题,从而有了事务的隔离,四种隔离级别:
    • DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别

    • 读未提交(Read Uncommitted):

      脏读、不可重复读、幻读都有可能发生

    • 读已提交(Read Committed):

      避免脏读,但是无法避免不可重复读,幻读。Oracle的默认隔离级别为读已提交。

    • 可重复读(Repeated Read):

      脏读、不可重复读可以避免,但是无法避免幻读。MYSQL的默认事务隔离级别为可重复读。

    • 串行化(Serialization):

      所有的事务串行化执行,效率很低,隔离级别最高,避免所有问题

    4、持久性(durability):

    事务一旦提交,影响将是永久的(写入磁盘),即使数据库系统坏了也能够恢复

事务的7种传播行为

spring事务传播行为详解 - 双间 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个小白QAQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值