3.4锁机制、事务

MySQL锁机制

锁:

  读锁:共享锁,也称为s锁,只读不可写,包括当前事务,多个读互不阻塞

  写锁:独占锁,排它锁,也称为X锁,写锁会阻塞其它事务(不包括当前事务)的读和写

举例:

  读锁和读锁是兼容的,写锁和其它锁不兼容

  事务T1获取了一个行r1的读锁,另外事务T2可以立即获得r1的读锁,此时T1和T2共同获得行r1的读锁,此种情况成为锁兼容

  但是另外一个事务T3如果想获得行r1的写锁,则必须等待T1对行r1读锁的释放,此种情况也成为锁冲突。

锁粒度:

  表级锁:MyISAM

     行级锁:InnoDB

实现:

  存储引擎:自行实现其锁策略和锁粒度

  服务器级:实现了锁,表级锁,用户可显示请求

分类:

  隐式锁:由存储引擎自动施加锁

  显式锁:用户手动请求

锁策略:在锁粒度及数据安全性寻求的平衡机制

锁优缺点:

  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

对表date加读锁:lock table date read;

对表date加写锁:lock table date write;

事务:

有事务之前:

  数据库修改一条数据是直接在内存中修改然后写入数据库文件

有事务之后:

  数据库修改的数据先存入事务日志(告诉用户成功),然后再存入数据库文件

  日志是顺序写的,更快(更详细),数据库是随机读写

 什么是事务:

  事务Transactions:一组原子性的SQL语句,或一个独立工作单元
  事务日志:记录事务信息,实现undo,redo等故障恢复功能

事务特性

  ACID特性:
  A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
  C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
  I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
  D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
事务生命周期

 

 

 管理事务

显示启动事务

BEGIN

BEGIN WORK

START TRANSCATION

结束事务

COMMIT  #提交

ROLLBACK  #回滚

注意:只有事务型存储引擎中的DML语句才能支持此类操作

自动提交:set autocommit={1|0}

默认为1,为0时非自动提交

事务支持保存点

savepoint identifier

rollback work to savepoint identifiter

release savepoint identifiter

查看事务

查看当前正在进行的事务:select * frominformation_schema.innodb_trx;

查看当前锁定的事务:select * frominformation_schema.innodb_locks;

查看当前等锁的事务:select * frominformation_schema.innodb_lock_waits;

查看事务锁的超时时长,默认为50S:show global variables like 'innodb_lock_wait_timeout';

MySQL支持四种隔离级别,事务隔离级别:从上至下更加严格

隔离级别 脏读 不可重复读 幻读 加读锁
读未提交 可以出现 可以出现 可以出现
读提交 不允许出现 可以出现 可以出现
可重复读 不允许出现 不允许出现 可以出现
序列化 不允许出现 不允许出现 可以出现

 

 

 

 

 

 

READ UNCOMMITTED
  可读取到未提交数据,产生脏读
READ COMMITTED
  可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
REPEATABLE READ
  可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置
SERIALIZABLE
可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差
MVCC和事务的隔离级别:
MVCC(多版本并发控制机制)只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁

posted @ 2022-06-06 14:32  胖丿虎  阅读(37)  评论(0编辑  收藏  举报