
【MySQL】(七)事务特性ACID、三大并发读、四种事务隔离级别
发布日期:2021-05-08 01:09:12
浏览次数:23
分类:精选文章
本文共 2199 字,大约阅读时间需要 7 分钟。
一、 事务特性ACID
1.1 原子性Atomicity
原子性:
- 事务的所有操作,要么全部执行,要么全部不执行,不存在部分执行成功的情况。
- 如果执行过程中出错,则应该回滚
rollback
到事务开始前的状态。 - 事务是一个不可分割的整体。
1.2 一致性Consistency
一致性:事务执行完成之后,数据应该满足完整性约束。
举例:事务执行前A、B的存款都是100,事务内容是A转账B,则事务执行完成之后,需要满足A和B的存款和还是200。
1.3 隔离性Isolation
隔离性:不用的事务之间互不干扰。
隔离级别:关于数据的隔离性,MySql提供了四种级别,后文详细说明。
1.4 持久性Duration
持久性:事务一旦提交,则对数据库中数据的改变会是永久性的,即便数据库系统遇到故障也不会丢失。
二、并发读: 脏读、不可重复读、幻读
如果不对事务进行隔离性的保障,则在多个事务并发进行时,可能出现:脏读、不可重复读、幻读。
2.1 脏读
脏读:一个事务处理过程中,读取了另一个事务还未提交的数据。
举例:
- money = 0.
- 事务A、B开启。
- 事务A将money修改为100,但
还未提交
。 - 事务B执行
money = money + 100
,将money修改为200。 - 事务A回滚,事务B提交。
- 异常:经过一次自增100的操作,money却增加了200,好懵!!
重点:针对还未提交
的数据。
2.2 不可重复读
不可重复读:一个事务处理过程中,对同一数据的多次查询得到不同的结果,这是由于另一个事务在多次查询间隔修改了这个数据。
举例:
- money = 0。
- 事务A、B开启。
- 事务B第一次读取money = 0。
- 事务A修改money为100,然后
提交
。 - 事务B第二次读取money = 100。
- 异常:在同一个事务中,对money的两次读取,结果不同,好懵!!
重点:针对被修改
且已提交
的数据。
2.3 幻读
幻读:一个事务处理过程中,读取了另一个事务新增加
或删除
的数据。
举例:
- 表中共计10条记录。
- 事务A、B开启。
- 事务B第一次count,获悉count(id) = 10。
- 事务A新增了2条记录,删除了一条记录,然后
提交
。 - 事务B第二次count,获悉count(id) = 11。
- 异常:在同一个事务中,对表中数据总条数的两次统计,结果不同,好懵!!
重点:针对新增删
且已提交
数据。
三、四种事务隔离级别
MySql提供了四种事务隔离级别,从低到高依次是:读未提交、度已提交、可重复度、串行化。
3.1 读未提交Read Uncommitted
- 简单理解:一个事务可以读取
Read
到其他事务未提交Uncommitted
的数据。 - 解决的并发事务问题:最低级别,无法解决任务问题。
- 未解决的并发事务问题:脏读、不可重复读、幻读。
3.2 读已提交 Read Committed
- 简单理解:一个事务需要读取Read到其他事务已经提交
Committed
的数据。 - 解决的并发事务问题:因为
已提交
的保证,能够避免脏读的出现。 - 未解决的并发事务问题:不可重复读、幻读。
3.3 可重复读Repeatable Read
- 简单理解:一个事务能够对同一记录进行重复性的
Repeatable
读取Read
,多次读取结果一致。 - 解决的并发事务问题:不可重复读、脏读。
- 未解决的并发事务问题:幻读
- 特别:MySql的
默认事务隔离级别
。
3.4 串行化Serializable
- 简单理解:多个事务以串行化
Serializable
的方式运行,自然不会产生并发事务问题。 - 解决的并发事务问题:幻读、不可重复读、脏读。
- 特别:效率特别低。
3.5 三种并发读与四种事务隔离级别的总结
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 未解决 | 未解决 | 未解决 |
读已提交 | 解决 | 未解决 | 未解决 |
可重复读 | 解决 | 解决 | 未解决 |
串行化 | 解决 | 解决 | 解决 |
3.6 隔离级别的查看与设置
3.6.1 查看
mysql> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.03 sec)
3.6.2 mysql设置
mysql> set tx_isolation='read-committed';Query OK, 0 rows affected (0.01 sec)mysql> select @@tx_isolation;+----------------+| @@tx_isolation |+----------------+| READ-COMMITTED |+----------------+1 row in set (0.01 sec)
3.6.3 java设置
注意:在开启事务之前,设置事务隔离级别。
//获取连接Connection conn = getConnect();//设置事务隔离级别conn.setTrasactionIsolation(Connection.TRANSACTION_SERIALIZABLE);//开启事务conn.setAutoCommit(false);
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月29日 00时21分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux应用-线程操作
2021-05-09
多态体验,和探索爷爷类指针的多态性
2021-05-09
系统编程-进程间通信-无名管道
2021-05-09
记2020年初对SimpleGUI源码的阅读成果
2021-05-09
C语言实现面向对象方法学的GLib、GObject-初体验
2021-05-09
系统编程-进程-ps命令、进程调度、优先级翻转、进程状态
2021-05-09
为什么我觉得需要熟悉vim使用,难道仅仅是为了耍酷?
2021-05-09
一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan
2021-05-09
HDOJ2017_字符串统计
2021-05-09
高等软工第二次作业《需求分析阶段总结》
2021-05-09
404 Note Found 团队会议纪要
2021-05-09
CentOS安装Docker-ce并配置国内镜像
2021-05-09
使用JWT作为Spring Security OAuth2的token存储
2021-05-09
使用Redis作为Spring Security OAuth2的token存储
2021-05-09
【SOLVED】Linux使用sudo到出现输入密码提示延迟时间长
2021-05-09
项目引入非配置的文件,打成war包后测试报错的可能原因
2021-05-09
Git学习笔记
2021-05-09
SpringBoot笔记
2021-05-09