提示:以下是本篇文章正文内容,下面案例可供参考

<>一、三个概念

<>

1,脏读:

又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。

2、不可重复读:

是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

3,幻读:
事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读

二、mysql有四种隔离级别

* 读未提交
* 读已提交
* 可重复读
* 序列化
1、读未提交

  你在修改表中数据的时候,你可以看到另一个人没有提交的数据。这是一种安全级别最低的隔离级别,目前这种级别只是理论存在,因为目前基本没有数据库采用这种隔离方式,这种隔离级别会产生的问题就是脏读。

2、读已提交

  很好理解,假如此时,你和另外一个人同时操作同一张表,有一条数据是id为1 姓名为小明的数据,此时另外一个人对这个数据修改为id为2
姓名为小红(没有提交前),你再次查询得到的数据一直都是1 小明,而当这个人修改完后输入commit提交后,此时你在查询时,数据则会变为2
小红,这就是读已提交,意思其实和字面意思一样,只能读取当已提交的数据。这个隔离级别解决了脏读的问题,但是缺点就是不可重复读。

3、可重复读

  这是mysql的默认隔离级别,与第二种不同的是,此时如果和你操作一张表的另一个人commit后,你select查询后依旧是1
小明,只有当你自己commit之后,当前事务完全结束后,你才可以看到修改后的值,这种隔离级别解决了不可重复读的问题,但是出现了一种新的问题,就是幻读,什么是幻读呢?举个例子,当你查询某条数据时,可能显示的是1
小明,但是此时可能有个人正好修改好了这条数据,当你提交后再次查询时,你会发现变成了2 小红,这个时候你可能会觉得不对啊,刚才我刚查询的时候明明不是2
小红啊,明明是1小明啊,是我产生幻觉了吗?这就是幻读。

4、序列化

  最安全的默认隔离级别,但是并不支持并发,相当于单线程,不允许并发操作数据库,事务开启后,只允许一个人进行操作,直到提交后下一个人才可以进入。

三、事务

事务的四个性值:ACID(原子性,一致性,隔离性和持久性)

1、原子性:事务中包含有很多操作,这些操作要么全部执行,要么全部不执行,所以支持回滚操作。

2、一致性:系统从一种一致性到另一种一致性状态。事物的一致性决定了一个系统设计和实现的复杂度。事务可以具有不同程度的一致性。

强一致性:读操作可以立即读到操作的更新操作。

弱一致性:提交的更新操作不一定立即会被读操作读到,这种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。

最终一致性:(弱一致性的一种特殊情况)最终所有的事务都会读到之前事务更新的最新值。

3、隔离性:有上面四种隔离性。

4、持久性:事务的操作对数据库的影响时持久的。

<>

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信