mysql隔离机制_MySQL锁和隔离机制

一:MySQL锁

二:MySQL事务

三:MySQL隔离级别

四:MVCC

1.1为什么要有锁?

因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对某张表的某条数据或某些数据进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概念。

1.2锁的分类

1.2.1按对数据的操作类型

LOCK TABLES tb_namelock_type{READ|WRITE};

UNLOCKTABLES ;

读锁(共享锁):针对同一块数据,多个读操作可以同时进行而不会互相影响。

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

示例1:读锁

440056d479ae42f0057859809305ef33.png

0eb03b6537b595c2228636778c2b9185.png

289f553247c885d26dddc30295e46245.png

20813c18803a204b7761588c74c7627f.png

示例2:写锁

6dcdea891b9ab8e2feb66afcf5175cf4.png

2bae2736d3cba0c8d0800570f5625088.png

04ee9efed370b39ca402510ec66f0abf.png

52d5c31808021928640c1ebc8b7ac67a.png

1.2.2锁的粒度:MySQL服务器仅支持表级别的所,行所需要存储引擎完成

表锁:管理锁的开销最小,同时允许的并发量也最小的锁机制。MyIsam存储引擎使用的锁机制。当要写入数据时,把整个表都锁上,此时其他读、写动作一律等待。在MySql中,除了MyIsam存储引擎使用这种锁策略外,MySql本身也使用表锁来执行某些特定动作,比如alter table.

行锁:可以支持最大并发的锁策略。InnoDB存储引擎采用这种策略

2.1 ACID

原子性(Autmic):事务所引起的数据库操作,要么都完成,要么都不执行

一致性(Consistency):完成之前和完成之后是一样的(两个帐户的钱,转账之前和之后的总和是一样的)

隔离性(Isolation):一个事务的执行不能影响另一个事务的执行

持久性(Durability):一旦事务成功完成,系统必须保证任何故障都不能引起事务的不一致性。

2.2事务的状态

103c6660dc3b7dbf6c6c0d8a64501356.png

2.3保存点(SAVEPOINT)

一个很大的事务,这个事务有100个操作,执行到80个的时候发现第75个错了,怎么办?

撤销??---->80个都撤销了--->不好

这样就引出保存点了,每10个做一次保存点

回滚保存点:ROLLBACK TO sid

228f461a1a47259df91b8e587fa2ecaf.png

示例:

c16d6f72990dcf41202123bc635dc6b3.png

597068cc4cebc4984ec29196798853b3.png

3.1事务的隔离级别

READ-UNCOMMITTED:读未提交  别人一操作,立马就能看见(最低的隔离级别)

READ-COMMITTED:读提交  别人提交了,才能看见

REPEATABLE-READ:可重读

(不管别的事务是否提交,我的事务之内看到的依然是一样的,例如A事务执行了UPDATE操

作,B事务执行SELECT操作,在A执行前和后,B执行的结果都一样)

SERIALIZABLE:可串行化

查看当前数据库的隔离级别:

SHOW GLOBAL VARIABLES LIKE '%ISO%';

SELECT @@TX_ISOLATION;

4c78c834644074c2deb3b2be0e84f4fc.png

0a0bc0a494346b112e80c002b9cbf174.png

3.2事务隔离级别对事务的影响

3.2.1READ-UNCOMMITTED示例

【客户端1】

e339fb8dd268c3993ee36e9f65842d2a.png

【客户端2】

5f9b5e2f7e6bdf8c2b2f1282f9d58985.png

【客户端1】

6a3ad95910483faf7c6a739e885719b6.png

【客户端2】

eede93854e24c77bb27de374e26734c0.png

总结:客户端2在一个事务内,两次读取的数据不一样,产生了幻读

3.2.2READ-COMMITTED

【客户端1】

7db2ba54f7cbb5d41e4702ca4bc9198d.png

【客户端2】

18b1b8ee05eb0caf0936b39e05c304f8.png

【客户端1】

407b30666f2c956ae88cf0eb559e8284.png

【客户端2】

02a7a47a763f8e6514e86557d961de38.png

总结:客户端1未执行提交之前,客户端2看不到更新后的数据,客户端1执行提交之后,客户端2看到了更新以后的数据,客户端2在一个事务内,执行两次查询仍然看到了不同的结果,依然存在幻读的问题

3.2.3REPEATABLE-READ

【客户端1】

e3b5824e9632ed021cef0208f427fb53.png

【客户端2】

3a45abe6dca8f034ef15d43cc0a1f670.png

【客户端1】

f60a37be89ab21c9e3512d2c596fecdc.png

【客户端2】

ad5cd00c62b30fe5d0b1107a32893346.png

ed27071bd387014a2703c0e4ef947138.png

总结:客户端2在提交前和提交后看到的数据依然不一样,产生了幻读

3.2.4SERIALIZABLE

【客户端1】

e6d27a6820f7266a37e0073228e08b8d.png

【客户端2】

9754dd7dbfca678c5d517d95240584a4.png

【客户端1】

5783980d6def32c1dc0d2c46fc7de91b.png

【客户端2】

8cf0f930983a51785c76a6724cf284e5.png

总结:虽然不存在数据幻读的问题,但是执行效率非常低

以下内容来自于:http://blog.csdn.net/chen77716/article/details/6742128

4.1相关概念

redo log

redo log就是保存执行的SQL语句到一个指定的Log文件,当Mysql执行recovery时重新执行redo log记录的SQL操作即可。当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。redo log在磁盘上作为一个独立的文件存在,即Innodb的log文件。

undo log

与redo log相反,undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd数据文件中(表空间),即使客户端设置了每表一个数据文件也是如此。

rollback segment

回滚段这个概念来自Oracle的事物模型,在Innodb中,undo log被划分为多个段,具体某行的undo log就保存在某个段中,称为回滚段。可以认为undo log和回滚段是同一意思。

4.2数据的更新过程

初始数据:假设这是刚刚INSERT的数据,可以认为隐含ID为1,其它两个值为NULL

eab5372479d97010b1cfaabc86e7f3f5.png

事务1:修改NAME和AGE字段的值

Transacation1

1452e29102b95a0c5de292d92838bb74.png

b65e73a5a5a7f0096422e888ff581f14.png

事务2:修改NAME和AGE字段的值

Transacation2

9aa31428123d66f43ae1f1a8f2fbd9c3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值