标签:mysql锁和隔离机制
一:MySQL锁
二:MySQL事务
三:MySQL隔离级别
1.1为什么要有锁?
因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对某张表的某条数据或某些数据进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概念。
1.2锁的分类
1.2.1按对数据的操作类型
LOCK TABLES tb_namelock_type{READ|WRITE};
UNLOCKTABLES ;
读锁(共享锁):针对同一块数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
示例1:读锁
示例2:写锁
1.2.2锁的粒度:MySQL服务器仅支持表级别的所,行所需要存储引擎完成
表锁:管理锁的开销最小,同时允许的并发量也最小的锁机制。MyIsam存储引擎使用的锁机制。当要写入数据时,把整个表都锁上,此时其他读、写动作一律等待。在MySql中,除了MyIsam存储引擎使用这种锁策略外,MySql本身也使用表锁来执行某些特定动作,比如alter table.
行锁:可以支持最大并发的锁策略。InnoDB存储引擎采用这种策略
2.1 ACID
原子性(Autmic):事务所引起的数据库操作,要么都完成,要么都不执行
一致性(Consistency):完成之前和完成之后是一样的(两个帐户的钱,转账之前和之后的总和是一样的)
隔离性(Isolation):一个事务的执行不能影响另一个事务的执行
持久性(Durability):一旦事务成功完成,系统必须保证任何故障都不能引起事务的不一致性。
2.2事务的状态
2.3保存点(SAVEPOINT)
一个很大的事务,这个事务有100个操作,执行到80个的时候发现第75个错了,怎么办?
撤销??---->80个都撤销了--->不好
这样就引出保存点了,每10个做一次保存点
回滚保存点:ROLLBACK TO sid
示例:
3.1事务的隔离级别
READ-UNCOMMITTED:读未提交 别人一操作,立马就能看见(最低的隔离级别)
READ-COMMITTED:读提交 别人提交了,才能看见
REPEATABLE-READ:可重读
(不管别的事务是否提交,我的事务之内看到的依然是一样的,例如A事务执行了UPDATE操
作,B事务执行SELECT操作,在A执行前和后,B执行的结果都一样)
SERIALIZABLE:可串行化
查看当前数据库的隔离级别:
SHOW GLOBAL VARIABLES LIKE ‘%ISO%‘;
SELECT @@TX_ISOLATION;
3.2事务隔离级别对事务的影响
3.2.1READ-UNCOMMITTED示例
【客户端1】
【客户端2】
【客户端1】
【客户端2】
总结:客户端2在一个事务内,两次读取的数据不一样,产生了幻读
3.2.2READ-COMMITTED
【客户端1】
【客户端2】
【客户端1】
【客户端2】
总结:客户端1未执行提交之前,客户端2看不到更新后的数据,客户端1执行提交之后,客户端2看到了更新以后的数据,客户端2在一个事务内,执行两次查询仍然看到了不同的结果,依然存在幻读的问题
3.2.3REPEATABLE-READ
【客户端1】
【客户端2】
【客户端1】
【客户端2】
总结:客户端2在提交前和提交后看到的数据依然不一样,产生了幻读
3.2.4SERIALIZABLE
【客户端1】
【客户端2】
【客户端1】
【客户端2】
总结:虽然不存在数据幻读的问题,但是执行效率非常低
本文出自 “凡夫俗子” 博客,请务必保留此出处http://caoyt.blog.51cto.com/9978141/1641163
标签:mysql锁和隔离机制
原文地址:http://caoyt.blog.51cto.com/9978141/1641163