Spring中的事务属性(Transaction Attribute)详细讲解以及并发出现的一些问题如何解决?

本文介绍了事务的属性,特别是隔离属性,用于解决并发问题。隔离属性包括READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,各自对应不同的并发安全与运行效率。MySQL的默认隔离级别为REPEATABLE_READ,而Oracle为READ_COMMITTED。针对Oracle不支持REPEATABLE_READ的情况,文章提到了多版本对比的解决方案。最后,给出了在实际应用中选择隔离级别的建议,并推荐使用乐观锁来处理并发问题。

前言

最近在网上看到一首诗:“代码尽头谁为峰,一见秃头道成空。编程修真路破折,一步一劫渡飞升。”感觉还挺有意境与意思的。
在这里插入图片描述

上面这图是我最喜欢的大佬(沉默王二)给大家总结的一个Java学习路线,优快云路径放在了下面,感兴趣的伙伴们可以进去看一下
Java详细学习路线图

正文

什么是事务属性

  1. 属性:描述物体特征的⼀系列值
    举例:性别 身⾼ 体重 …
    事务属性:描述事务特征的⼀系列值
  2. 隔离属性
  3. 传播属性
  4. 只读属性
  5. 超时属性
  6. 异常属性

如何添加事务属性

 @Transactional(isloation=,propagation=,readOnly=,timeout=,rollbackFor=,
noRollbackFor=,)

事务属性详解

隔离属性 (ISOLATION)
隔离属性的概念
  1. 概念:他描述了事务解决并发问题的特征
  2. 什么是并发
    多个事务(⽤户)在同⼀时间,访问操作了相同的数据

同⼀时间:0.000⼏秒 微⼩前 微⼩后

并发会产⽣那些问题

1.脏读

  • 不可重复读
  • 幻影读
  • 并发问题如何解决
    通过隔离属性解决,隔离属性中设置不同的值,解决并发处理过程中的问题。

事务并发产⽣的问题

  • 脏读
    1.⼀个事务,读取了另⼀个事务中没有提交的数据。会在本事务中产⽣数据不⼀致的问

    解决⽅案 @Transactional(isolation=Isolation.READ_COMMITTED)
  • 不可重复读
    1.⼀个事务中,多次读取相同的数据,但是读取结果不⼀样。会在本事务中产⽣数据不
    ⼀致的问题
    2.注意:1 不是脏读 2 在⼀个事务中
    3.解决⽅案 @Transactional(isolation=Isolation.REPEATABLE_READ)
    4.本质: ⼀把⾏锁
  • 幻影读
    1.一个事务中,多次对整表进⾏查询统计,但是结果不⼀样,会在本事务中产⽣数据不
    ⼀致的问题
    2.解决⽅案 @Transactional(isolation=Isolation.SERIALIZABLE)
    3.本质:表锁

总结

并发安全: SERIALIZABLE>REPEATABLE_READ>READ_COMMITTED
运⾏效率: READ_COMMITTED>REPEATABLE_READ>SERIALIZABL

数据库对于隔离属性的⽀持

隔离属性的值MySQLOracle
ISOLATION_READ_COMMITTED⽀持⽀持
IOSLATION_REPEATABLE_READ⽀持不⽀持
ISOLATION_SERIALIZABLE⽀持⽀持

Oracle不⽀持REPEATABLE_READ值 如何解决不可重复读?
采⽤的是多版本⽐对的⽅式 解决不可重复读的问题

默认隔离属性

ISOLATION_DEFAULT: 会调⽤不同数据库所设置的默认隔离属性
MySQL : REPEATABLE_READ
Oracle: READ_COMMITTED

查看数据库默认隔离属性

  • MySQL
 select @@tx_isolation;
  • Oracle
 SELECT s.sid, s.serial#,
 CASE BITAND(t.flag, POWER(2, 28))
 WHEN 0 THEN 'READ COMMITTED'
 ELSE 'SERIALIZABLE'
 END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr
AND s.sid = sys_context('USERENV', 'SID');

隔离属性在实战中的建议

推荐使⽤Spring指定的ISOLATION_DEFAULT

  1. MySQL repeatable_read
  2. Oracle read_commited
    未来实战中,并发访问情况 很低

如果真遇到并发问题可以使用乐观锁

Hibernate(JPA) Version
MyBatis 通过拦截器⾃定义开发

本篇文章主要讲了隔离属性,其他属性会在下篇文章中介绍,如有错误点 欢迎大家在下面评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

忆梦九洲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值