3. MySQL 事物隔离级别及读写锁
时间:2021-02-22 12:47:48
收藏:0
阅读:0
一 MySQL 事务隔离级别
- 读未提交(READ UNCOMMITTED):一个事务可以读到其他事务没有提交的数据,会出现脏读、不可重复读、幻读
- 读已提交(READ COMMITTED):一个事务只能读到另一个已提交的数据修改过的数据,并且其他事务没队该数据进行一次修改并提交后,该事务都能查询到最新值,会出现不可重复读、幻读
- 可重复读(REPEATABLE READ):一个事务第一次读过某条记录后,即使其他事务修改了该记录的值,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据,这就是可重复读,这种级别仍然会出现幻读,这也是 MySQL默认的隔离级别
- 串行化(SERIALIZABLE):同一时间段内对相同记录只能有一个事务进行读/写,其他的读/写都会被阻塞,读-写是相互互斥的,所以不会出现脏读、不可重复读、幻读等现象
二 MySQL 隔离级别的操作
-- 修改隔离级别 mysql> set session transaction isolation level read uncommitted; -- 查看隔离级别 mysql> select @@tx_isolation;
三 读锁与写锁
- 读锁:共享锁、Shared Locks、S锁
- 写锁:排它锁、Exclusive Locks、X锁
读写锁总结:读读共享、读写冲突、写写冲突
读操作
-- 不加任何锁 select ...; -- 加读锁方式 select ... lock in share mode; -- 加写锁方式 select ... for update;
写操作
- DELETE:删除一条数据时,先对记录加写锁,再执行删除操作
- INSERT:插入一条数据时,会先加隐式锁来保护这条新插入的记录在本事务提交前不被别的事务访问到
- update:1. 如果被更新的列修改前后没有导致存储空间的变化,那么会先给记录加写锁,再直接对数据进行修改;2. 如果被更新的列修改前后导致了存储空间的变化,会先给记录加写锁,然后将记录删除,再Insert 一条新的记录
评论(0)