数据库事务介绍(三)数据并发会产生的问题

目录

目录

概要

详细介绍

数据准备

数据并发问题

1.脏写

2.脏读

3.不可重复读

4.幻读

注意

注意1

注意2



概要

mysql是一个客户端/服务端结构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后就可以称为一个回话(session)。每个客户端都可以在自己的回话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可以同时处理多个事务。事务有隔离性的特性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后其他事务才可以继续访问这个数据。但是这样对性能影响太大,我们既想保持事务的隔离性又想让服务器在处理访问同一数据的多个事务时性能尽量高些,那就看二者如何取舍了。

详细介绍

数据准备

我们需要创建一个表

CREATE TABLE student(studentno INT,
		    NAME VARCHAR(20),
		    class VARCHAR(20),
		    PRIMARY KEY(studentno)
 )ENGINE=INNODB CHARSET=utf8;
 

然后插入一条数据

 INSERT INTO student VALUES(1,'夏天','1班');
 

现在表里的数据是这样的

数据并发问题

针对事务的隔离性和并发性,我们怎么做取舍呢?先看一下访问相同数据的事务在不保证串行执行(也就是执行完一个再去执行另一个)的情况下可能会出现哪些问题

1.脏写

对于两个事务sessionA、sessionB,如果事务A修改了另一个未提交事务B修改过的数据,那就意味着脏写了。

示意图如下

事务A和事务B个开启一个事务,事务B中的事务先将studentno列为1的记录的name更新为 李四
然后事务A中接着又把studentno列为1的记录的name修改为  张三。
如果之后事务B中的事务进行了回滚,那么事务A中的更新也将不复存在。
这种现象就称为脏写。这时事务A中的事务就没有效果了,明明把数据更新了,最后也提交了事务,
最后看到的数据什么变化也没有还是 夏天 。

2.脏读

对于两个事务A和B,A读取了已经被B更新但是还没有被提交的字段。之后若B回滚,A读取的内容就是临时且无效的。

脏读示意图

事务A和事务B各开启一个事务,事务B中的事务先将studentno为1的记录的name修改为  张三
然后事务A中的事务去查询这个studentno为1的记录,如果读到了 张三,而事务B稍后进行了
回滚,那么事务A相当于读到了一个不存在的数据,这就是脏读。

3.不可重复读

对于两个事务A和B,事务A读取了一个字段,然后事务B更新了该字段。之后事务A再次读取同一个字段发现值就不同了,这就意味着发生了不可重复读。

不可重复读示意图

我们在事务B中提交了几个隐式事务(注意是隐式事务,意味着语句结束事务就提交),
这些事务都修改了studentno列为1的记录的name列的值,每次事务提交过后,
如果事务A中的事务都可以查看到新的值,这就是不可重复读。

4.幻读

对于两个事务A和B,事务A从一个表中读取一个字段,然后事务B在该表中插入了一些新的行。之后如果事务A再次读取同一个表,就会多出几行,那就意味着发生了幻读。

幻读示意图

事务A中的事务先根据条件进行查询学生表,得到name列值为张三的记录;
之后事务B提交了一个隐式事务,该事务想表中插入了一条新的记录;
之后事务A中的事务再根据相同的条件查询学生表,结果包含事务B提交的记录,
这种现象被称为幻读。我们把新插入的那些记录称为幻影记录。

注意

注意1

有人会问,如果事务B删除了一些记录而不是插入新纪录,那么事务A之后读取的记录变少了,这种算不算幻读呢?这不是幻读,幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取到了之前没有读到的记录。

注意2

那对于先前已经读取到的记录,之后又读取不到的这种情况怎么说呢?这相当于对每一条记录都发生了不可重复读的现象。幻读是重点强调读取到了之前读取没有获取的记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢编程的夏先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值