感觉脏读违反了事务的隔离性,请教

游戏宛与洛 2015-07-24 08:46:41
一个事务读取另一个事务未提交的内容,称为脏读。但事务的隔离性定义中又有这样的描述:“当前事务不会查看由另一并发事务正在修改的数据。“

在脏读时,一个事务读取了另一个事务未提交的内容,难道未提交的内容不算是另一并发事务正在修改的数据吗?如果不算,事务的隔离性如何体现呢,什么才算是”事务正在修改的数据?

自学Mysql中,有些抽象的概念还是有些模糊,希望各位高人不吝赐教。
...全文
1277 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞啊子 2018-09-05
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
另外,在mysql中是无法读取到脏数据的,因为myisam存储引擎是 表级别的锁,并发性很差。

而innodb存储引擎,支持mvcc,多版本并发控制,你读取到的 总是已提交的数据。

而在oracle中也是如此。

那么现在说到 能读取脏数据,那只有 sql server了,你可以在查询中指定 nolock,或者 指定隔离级别为 read uncommitted,这个就是脏读,也就是说 可以读取到未提交的数据,那么好处是 在读取数据时 不需要 读锁,所以不会被修改数据的事务 锁定。


在mysql中如何实现读取事务“未提交”的数据呢?
Read Uncommitted读未提交级别可以实现吗?
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ckc 2018-08-16
  • 打赏
  • 举报
回复
这种违反只要不影响业务的正常处理,是没关系的 至于是不是会影响业务的正常处理,需要具体情况具体分析 比如有一个论坛,一个人在发贴子,发了帖子之后要更新此人的发贴数啊,最后活动时间啊,金币啊等等乱七八糟的东西,可能还有更新全局的论坛发贴数量,我们可以把这些看成是一个事务。另外有一个需要读取当天所有人发贴数的地方,这个并不需要在这个事务跑完再读取,脏读读到的结果完全可以满足我们的需要,我们就可以在这个场景下使用脏读。而如果完全事务隔离,因为可能同时有很多人在发贴,就会影响读取的效率
徐乙 2018-08-15
  • 打赏
  • 举报
回复
事务的隔离性并不是:A事务修改的东西,B看不到。
这句话只是事务的隔离性中的隔离级别之一
什么违反了隔离性简直是谬论,最低的一层隔离级别的时候,A事务修改的东西,B当然看得到!
slwang001 2017-05-15
  • 打赏
  • 举报
回复
楼主可以先学习一下隔离级别的概念。 不同的需求需要不同的隔离级别。最低级别的隔离级别支持脏读,高一些的隔离级别不支持脏读。
zjcxc 2017-05-04
  • 打赏
  • 举报
回复
或者你会想到先判断业务规则,不满足条件则不写,但这只是代表写数据的一种实现方式,并不是所有情况都能使用这种方式
zjcxc 2017-05-04
  • 打赏
  • 举报
回复
成功提交,不成功回滚,这很正常 从内部实现来讲,写入数据的时候,如果某些数据不合法,那么就是不成功,不是回滚难道还提交? 从业务实现的角度(自己控制事务),如果某些数据不满足业务规则,难道你也提交?或者说你不管是否符合业务规则,只管把数据写进去?
zjcxc 2017-05-04
  • 打赏
  • 举报
回复
隔离的具体行为取决于隔离级别设置,默认的隔离级别满足不允许脏读,也就是满足我们经常看到的对事务的隔离性的说明的这句
a961627673 2017-05-02
  • 打赏
  • 举报
回复
事务的隔离是有级别的
c_sdn_shang_bu_qi 2016-03-28
  • 打赏
  • 举报
回复
读取了事务B中正在修改的数据。事务隔离级别为未提交(uncommited)读才会这样 cmmited级别不会出现脏读。
  • 打赏
  • 举报
回复
我也一直弄不明白这个概念上的定义。 事务A读取了事务B中正在修改的数据。那么事务A本身就违背了自身的隔离性原则。它还算是个事务吗?
LongRui888 2015-08-05
  • 打赏
  • 举报
回复
另外,在mysql中是无法读取到脏数据的,因为myisam存储引擎是 表级别的锁,并发性很差。 而innodb存储引擎,支持mvcc,多版本并发控制,你读取到的 总是已提交的数据。 而在oracle中也是如此。 那么现在说到 能读取脏数据,那只有 sql server了,你可以在查询中指定 nolock,或者 指定隔离级别为 read uncommitted,这个就是脏读,也就是说 可以读取到未提交的数据,那么好处是 在读取数据时 不需要 读锁,所以不会被修改数据的事务 锁定。
LongRui888 2015-08-05
  • 打赏
  • 举报
回复
一个事务读取另一个事务未提交的内容,称为脏读。 这个问题就是 因为没有提交,比如,一条数据有个字段 v,现在有个事务A把这个v从10改成了100,但是呢,没有commit, 这个时候另一个事务B 如果读取了值,也就是100,而这个时候,刚才事务A因为其他原因 把事务rollback了, 那么这时候事务B读取到的就是不准确的数据,这就是脏读。 当然,如果事务A最后提交了,那么事务B读取到的也是正确的数据,但这个也是脏读。 所以,是不是脏读和 读取到的数据是否正确没有关系,只是说 读取到的是 不确定的数据。
qq_15522027 2015-08-05
  • 打赏
  • 举报
回复
楼主哪里看到的这种说法? 关于事务,很多代码最后都是判断操作是否成功,成功则提交,不成功则回滚。。 为什么他们不直接提交呢?非要先来个判断回滚
ACMAIN_CHM 2015-07-25
  • 打赏
  • 举报
回复
建议楼主先看一下事务隔离模式的几种不同和适用范围,否则不知道从哪儿谈起了。
游戏宛与洛 2015-07-24
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
有些应用在做某些查询的时候不关心数据的精确,而是关系速度,这时使用脏读就可以成为一种选择。
首先谢谢版主的回答,提到了需要根据具体的使用情况选择数据准确度和速度的一个均衡。 不过我还是有些关心概念上的问题,脏读是不是违反了事务的隔离性。如果是的话,仅仅引入事务的概念,看起来就已经解决了脏读的问题,因为事务的隔离性要求一个事务不能读另外事务正在修改的数据,也就是未提交的数据。这样理解正确吗?
ACMAIN_CHM 2015-07-24
  • 打赏
  • 举报
回复
有些应用在做某些查询的时候不关心数据的精确,而是关系速度,这时使用脏读就可以成为一种选择。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧