前言
最近在网上看到一首诗:“代码尽头谁为峰,一见秃头道成空。编程修真路破折,一步一劫渡飞升。”感觉还挺有意境与意思的。
上面这图是我最喜欢的大佬(沉默王二)给大家总结的一个Java学习路线,CSDN路径放在了下面,感兴趣的伙伴们可以进去看一下
Java详细学习路线图
正文
什么是事务属性
- 属性:描述物体特征的⼀系列值
举例:性别 身⾼ 体重 …
事务属性:描述事务特征的⼀系列值 - 隔离属性
- 传播属性
- 只读属性
- 超时属性
- 异常属性
如何添加事务属性
@Transactional(isloation=,propagation=,readOnly=,timeout=,rollbackFor=,
noRollbackFor=,)
事务属性详解
隔离属性 (ISOLATION)
隔离属性的概念- 概念:他描述了事务解决并发问题的特征
- 什么是并发
多个事务(⽤户)在同⼀时间,访问操作了相同的数据
同⼀时间: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
数据库对于隔离属性的⽀持
隔离属性的值 | MySQL | Oracle |
---|---|---|
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
- MySQL repeatable_read
- Oracle read_commited
未来实战中,并发访问情况 很低
如果真遇到并发问题可以使用乐观锁
Hibernate(JPA) Version
MyBatis 通过拦截器⾃定义开发
本篇文章主要讲了隔离属性,其他属性会在下篇文章中介绍,如有错误点 欢迎大家在下面评论