一直纠结于事务的ACID特性与隔离级别是作什么用的?

szuzsq 2018-07-07 05:47:28
我就不明白了,既然Mysql默认自动提交事务,而在更新操作时,自动加排他锁,别人都不能读,又不能写了.又怎么会产生脏读,幻读这些现象呢?
那ACID特性与隔离级别这些东西是不是属于Mysql低层的东西?我们实际使用Mysql的人用不着?


以下是摘抄书上的.
----------------------------------------------------------
共享锁:允许其他事务获得对相同行的共享锁(读操作),阻塞其他事务获得对相同行的排他锁(写操作)
排他锁:阻塞其他事务获得对相同行的共享锁和排他锁(读/写操作)

InnoDB在执行查询(select)语句时,不会给涉及的所有行加任何锁
InnoDB在执行更新(update,delete,insert)语句时,会自动给涉及的所有行加排他锁


----------------------------------------------------------
事务的ACID特性
1.原子性(A)
在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样.

2.一致性(C)
系统的状态是一致的,没有出错的.以转账为例,A有500元,B有300元,如果在一个事务里A成功向B转了50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元.

3.隔离性(I)
事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知.

4.持久性(D)
事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此.

丢失更新(修改时允许修改)
两个事务同时修改同一条数据

脏读(修改时允许读取)
一个事务读取了另一个事务未提交的同一条数据

不可重复读(读取时允许修改)
一个事务读取了另一个事务已提交的同一条数据,导致前后重复读取的数据不一样了

幻读(读取时允许插入)
一个事务读取了另一个事务新增加的不同数据,但这个事务不知道别人新增加了,就好像产生了幻觉一样

前3种是对同一条数据的并发操作,对程序的结果可能产生致命影响,尤其是金融等实时性,准确性要求极高的系统,绝不容许这三中情况的出现
第4种情况不会影响数据的真实性,在很多情况下是允许的,如社交论坛等实时性要求不高的系统


----------------------------------------------------------
隔离级别
1.读取未提交--------脏读,不可重复读,幻读
2.读取已提交--------不可重复读,幻读
3.可重复读----------幻读
4.序列化------------
...全文
313 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2018-07-09
  • 打赏
  • 举报
回复
你可以通过 start transaction 或 set autocommit=0,把事务提交变成手动的,这样就可以验证了
trainee 2018-07-09
  • 打赏
  • 举报
回复
引用
我就不明白了,既然Mysql默认自动提交事务,而在更新操作时,自动加排他锁,别人都不能读,又不能写了.又怎么会产生脏读,幻读这些现象呢?

因为你还没手动启动事务,复杂的业务流程不可能只有一条SQL语句
szuzsq 2018-07-08
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
并发操作的时候需要用到。

能详细说说吗?
ACMAIN_CHM 2018-07-08
  • 打赏
  • 举报
回复
并发操作的时候需要用到。

56,678

社区成员

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

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