• 欢迎来到Compiler网站,如果对网站内容感兴趣或者帮助到你,请为文章点赞,谢谢!

数据库相关概念

mysql 奔跑的蜗牛 2个月前 (04-18) 33次浏览 0个评论 扫描二维码

数据库相关概念的学习

  1. 不可重复读

不能重复读是指在事务开始之后, 第一次读取的结果集和第二次读取的结果集不一致。

EG: TRANSACTION1: select * from p where id < 5; TRANSACTION2: insert into p values (2); TRANSACTION2: commit; TRANSACTION1: select * from p where id < 5;

以上是作为一个正确的事务执行顺序, 如果TRANSACTION1两次执行了相同的SQL语句, 但是却获取了TRANSACTION2插入的结果。 这种主要是事务级别为READ COMMITTED时出现。

  1. 脏读

脏读是指的事务之间读取了其他事务没有提交的数据

EG: TRANSACTION1: BEGIN TRANSACTION1: SELECT * FROM p WHERE id < 5; TRANSACTION2: BEGIN TRANSACTION2: INSERT INTO p VALUES (2); TRANSACTION1: SELECT * FROM p WHERE id < 5;

TRANSACTION1两次读取之间,事务TRANSACTION2插入了一条数据,但是没有提交,如果TRANSACTION1读取到了TRANSACTION2插入的数据, 这就产生了数据脏读. 这种情况主要出现在READ UNCOMMITTED的隔离级别之下。

  1. 幻读

幻读指的是两个事务之间, 操作相同的数据差生了冲突,导致另外一个事务无法正常执行业务的后续操作。

TRANSACTION1: BEGIN; TRANSACTION1: SELECT * FROM WHERE id = 1;

TRANSACTION2: BEGIN; TRANSACTION2: INSERT INTO p VALUES (1);

TRANSACTION1: INSERT INTO p VALUES (1); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

以上主要操作了两个事务, 在TRANSACTION1中判断id=1的记录不存在, 准备插入一个id = 1的记录, 但是在这期间, TRANSACTION2插入了一条id = 1的记录, 这是导致了TRANSACTION1插入失败,但是当通过select * from where id = 1查询这条记录时, 却查询不到这条记录, 这是因为mysql采用了REPEATABLE READ的策略,导致了其他事务提交的数据不能被读取到。

解决幻读最好的办法就是通过的方式对需要操作的数据加锁, 防止事务执行失败。

NOTE: 在Serializable隔离级别之下, 查询语句默认的都会加锁(共享锁(S)), 因此这种的话, TRANSACTION1的第三部可以正常执行,TRANSACTION2等待锁的释放.


Compiler编程笔记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:数据库相关概念
喜欢 (1)
[阳光路上]
分享 (0)
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址