码迷,mamicode.com
首页 > 数据库 > 详细

MySQL锁和隔离机制

时间:2015-05-01 20:05:55      阅读:189      评论:0      收藏:0      [点我收藏+]

标签: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锁和隔离机制

标签:mysql锁和隔离机制

原文地址:http://caoyt.blog.51cto.com/9978141/1641163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!