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

前言

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

上面这图是我最喜欢的大佬(沉默王二)给大家总结的一个Java学习路线,CSDN路径放在了下面,感兴趣的伙伴们可以进去看一下
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

忆梦九洲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值