笔记(https://www.bilibili.com/video/BV1Kr4y1i7ru)
什么是锁?
mysql中有哪几种锁
表级锁
表级锁-表锁
write lock 写锁,
加锁客户端,可以读写操作, 其他客户端不能 读,写操作
表级锁-元数据锁
一个例子,事务中,增删改查时候,会自动加入元数据锁,不允许对表结构进行修改
表级锁-意向锁
比较复杂,看视频(https://www.bilibili.com/video/BV1Kr4y1i7ru?p=126&vd_source=3cf72bb393b8cc11b96c6d4bfbcbd890)
行级锁
额外补充知识
DDL(Data Define Languge):数据定义语言,用于库和表的创建、修改、删除
DML(Data Manipulate Language):数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录(数据)
事务隔离级别
SQL标准定义了四个隔离级别:
**读取未提交(READ-UNCOMMITTED):**最低的隔离级别,允许读取尚未提交的数据变更,可能造成脏读、不可重复读、幻读。
**读取已提交(READ-COMMITTED):**允许读取并发事务已经提交的数据,可以避免脏读,但是可能造成不可重复、幻读。
**可重复读(REPEATABLE-READ):**对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读。
**可串行化(SERIALIZABLE):**最高的隔离级别,完全服从ACID的隔离级别,所以的事务依次执行,可以避免脏读、不可重复读、幻读。
三、并发事务带来的问题
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但是可能会带来以下的问题:
**脏读(Dirty read):**当一个事务正在访问数据并且对其进行了修改,但是还没提交事务,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据的修改还没提交到数据库,所以另外一个事务读取的数据就是“脏数据”,这种行为就是“脏读”,依据“脏数据”所做的操作可能是会出现问题的。
**修改丢失(Lost of modify):**是指一个事务读取一个数据时,另外一个数据也访问了该数据,那么在第一个事务修改了这个数据之后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,这种情况就被称为修改丢失。例如:事务1读取表中数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果都是19,但是事务1的修改记录丢失了。
**不可重复读(Unrepeatableread):**指在一个事务内多次读取同一数据,在这个事务还没结束时,另外一个事务也访问了这个数据并对这个数据进行了修改,那么就可能造成第一个事务两次读取的数据不一致,这种情况就被称为不可重复读。
**幻读(Phantom read):**幻读与不可重复读类似,幻读是指一个事务读取了几行数据,这个事务还没结束,接着另外一个事务插入了一些数据,在随后的查询中,第一个事务读取到的数据就会比原本读取到的多,就好像发生了幻觉一样,所以称为幻读。
原文链接:https://blog.csdn.net/qq_34222160/article/details/124483303