MySQL锁和事务

文章目录

      • 表锁
      • 行锁
      • 事务的四大特性
      • 事务的隔离级别

表锁

开销小,加锁快,锁定粒度大,并发度最低,偏向myiasm存储引擎,发生锁的概率最高。innodb支持表锁和行锁,而且默认创建隐藏的主键索引;
意向共享锁IS: 通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加共享锁,那么此时innodb会先找到这张表,对该表加意向共享锁之后,再对记录A添加共享锁。
意向排它锁IX: 通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加排它锁,那么此时innodb会先找到这张表,对该加意向排它锁之后,再对记录A添加排它锁

行锁

开销大,加锁慢,会出现死锁,锁定粒度小,并发度高,偏向innodb存储引擎,发生锁的概率最低;
排它锁(X写锁): 当A事务的操作未完成时候,其他事务可以读取但是不能写入或更新。直到A释放锁(kill,unlock)。在操作DML语句默认加上X锁,也可以手动for update加上。
共享锁(S读锁): 若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。简单来说就是可以查看数据但不能修改和删除数据的一种锁,多个事务可以同时拥有

事务的四大特性

原子性(Atomicity): 所有语句作为一个单元全部执行成功或者全部取消,不能出现中间状态
一致性(Consistency): 如果数据库在事务开始时处于一致状态,则在执行该事务期间保留一致状态 。
隔离性(Isolation): 事务之间不能相互影响。
持久性(Durability): 事务成功完成后,所做的所有更改都会准确地记录在数据中并且不会丢失。

事务的隔离级别

RU(read-uncommitted): 读未提交,可能出现脏读(事务A读取了事务B已修改但尚未提交的数据,如果B事务回滚,则A读取的数据无效),不符合一致性。脏读可能,不可重复读可能,幻读可能

RC(read-committed): 读已提交,可能出现幻读(事务A读取到了事务B已经提交的修改的数据)不可重复读(一个事务读取到其他事务已经提交的数据,一般是由于update/delete造成的)。脏读不可能,不可重复读可能,幻读可能

RR(repeatable-read): 可重复读(一个事务读取到其他事务插入的数据,一般由于insert造成的),功能是防止"幻读"现象,使用的是undo的快照技术+GAP(间隙锁)+NextLock(下键锁)。

SR(serializable): 可串行化。可以防止死锁,但是并发事务性能差。脏读、不可重复读、幻读不可能。

transaction_isolation=read-uncommitted
transaction_isolation=read-committed
transaction_isolation=REPEATABLE-READ

你可能感兴趣的:(MySQL)