谈到事务一般都是以下四点

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

举个简单的例子理解以上四点

原子性
针对同一个事务

这个过程包含两个步骤

A: 800 - 200 = 600
B: 200 + 200 = 400

原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作

一致性(Consistency)
针对一个事务操作前与操作后的状态一致

操作前A:800,B:200
操作后A:600,B:400

一致性表示事务完成后,符合逻辑运算

持久性(Durability)
表示事务结束后的数据不随着外界原因导致数据丢失

操作前A:800,B:200
操作后A:600,B:400
如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:800,B:200
如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:600,B:400

隔离性(Isolation)
针对多个用户同时操作,主要是排除其他事务对本次事务的影响

两个事务同时进行,其中一个事务读取到另外一个事务还没有提交的数据,B

事务的隔离级别
脏读:
指一个事务读取了另外一个事务未提交的数据。

###不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

页面统计查询值

点击生成报表的时候,B有人转账进来300(事务已经提交)

虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响,多了一行)

四种隔离级别设置
####数据库
set transaction isolation level 设置事务隔离级别
select @@tx_isolation    查询当前事务隔离级别

####java
适当的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation

mysql模拟事务隔离性测试

SELECT @@session.tx_isolation;
SELECT @@tx_isolation;  SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SET SESSION TRANSACTION ISOLATION LEVEL read committed;
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;
SET SESSION TRANSACTION ISOLATION LEVEL serializable;  start transaction;--建表
drop table AMOUNT;
CREATE TABLE `AMOUNT` (
`id`  varchar(10) NULL,
`money`  numeric NULL
)
;
--插入数据
insert into amount(id,money) values('A', 800);
insert into amount(id,money) values('B', 200);
insert into amount(id,money) values('C', 1000);
--测试可重复读,插入数据
insert into amount(id,money) values('D', 1000);--设置事务
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SELECT @@tx_isolation;
--开启事务
start transaction;--脏读演示,读到其他事务未提交的数据
--案列1,事务一:A向B转200,事务二:查看B金额变化,事务一回滚事务
update amount set money = money - 200 where id = 'A';
update amount set money = money + 200 where id = 'B';--不可重复读演示,读到了其他事务提交的数据
--案列2,事务一:B向A转200,事务二:B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL read committed;  --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
select * from amount;
--事务一:B向A转200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事务二:B向C转200转100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数--幻读演示
--案列3,事务一:B向A转200,事务二:B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
select * from amount;
--事务一:B向A转200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事务二:B向C转200转100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数
  • serializable事务二会一直等着事务一提交再操作

事务ACID理解复习相关推荐

  1. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

  2. MySQL 事务 | ACID、四种隔离级别、并发带来的隔离问题、事务的使用与实现

    文章目录 事务 ACID 并发带来的隔离问题 幻读(虚读) 不可重复读 脏读 丢失更新 隔离级别 Read Uncommitted (读未提交) Read Committed (读已提交) Repea ...

  3. MySQL事务ACID实现原理

    照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isolati ...

  4. 什么是事务ACID原则?(建议收藏)

    MySQL二十二:事务ACID原则 要么都成功,要么都失败 事务ACID原则: 原子性.一致性.独立性.持久性 A(Atomicity)原子性 ​ 原子性很容易理解,也就是说事务里的所有操作要么全部做 ...

  5. 数据库事务ACID原则学习分享

    本人结合自己对技术的理解,努力以通俗易懂的内容帮助大家了解技术的基本原理,内容仅供参考,不对或不完善的地方请大家指教,感谢关注! 一.事务概念的引入 当今,信息化技术非常发达的时代,我们通过手机上的银 ...

  6. Mybatis:颠覆你心中对事务的理解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:祖大俊 my.oschina.net/zudajun/blo ...

  7. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UN ...

  8. mysql 事务关联_MySQL 关联、联合查询,事务ACID见解

    MySQL 关联.联合查询,事务ACID见解 1.关联查询分为几种情况: 1.1.内连接: 1.1.1.INNER JOIN INNER JOIN 产生的结果是两个表的交集 1.1.2.CROSS J ...

  9. 同一个事务里面对同一条数据做2次修改_[玩转MySQL之九]MySQL事务ACID[2-1]ACID详解...

    一. 引言 做数据库相关工作的同学都知道事务,就是一个操作序列 ,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位, ACID又是事务的四大特性. 那么就会有如下疑问: ACID具体代表什 ...

最新文章

  1. python批量读取csv文件-使用Python读写csv文件的三种方法
  2. python使用什么注释语句和运算-怎么使用python注释语句
  3. 数据挖掘流程(六):写报告
  4. HarmonyOS之AI能力·文档检测校正
  5. Ansible-playbook 部署redis主从
  6. 用手动创建新的script标签的方式,实现JavaScript脚本的异步加载
  7. python图片横向合并_[宜配屋]听图阁
  8. CentOS Linux 7绑定静态IP方法
  9. SpringBoot启动报jdbc连接池错误
  10. CSS2 及CSS3 在ie浏览器下的支持情况
  11. 关于 Java 数组的 12 个最佳方法
  12. actionSupport类
  13. 找回FLASH的序列号SN(转)
  14. H5前端开源框架收藏
  15. 如何将word图片粘贴到动易CMS里面
  16. SQL server 数据库分离成功后,但还是压缩不了,.mdf和.ldf文件拒绝访问
  17. medusa 使用教程
  18. Pytorch目标检测学习资源
  19. 剪辑视频怎么添加背景视频
  20. 软考高项真题解析-关键路径的计算

热门文章

  1. 计算机设计大赛国奖作品_3. 需求分析
  2. 【OpenCV 例程200篇】96. 谐波平均滤波器
  3. swift面向对象之多态与继承
  4. python选课系统代码_python模拟选课系统
  5. ilitek win10 触摸屏驱动_想做多大尺寸触摸框找融创方圆定制触摸屏工厂
  6. C++混淆点-构造函数参数
  7. 一条语句复制整个目录《转》
  8. linux/npm/git的简单操作
  9. object类型转换为Array类型
  10. jQuery基本知识