`
ghljx
  • 浏览: 19024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

关于Mysql 锁的机制一点理解

阅读更多
MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。
在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。
为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM设置已经调节得很好。
在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。
对WRITE,MySQL使用的表锁定方法原理如下:
如果在表上没有锁,在它上面放一个写锁。
否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> SHOW STATUS LIKE 'Table%';

+-----------------------+---------+

| Variable_name         | Value   |

+-----------------------+---------+

| Table_locks_immediate | 1151552 |

| Table_locks_waited    | 15324   |

+-----------------------+---------+

如果INSERT语句不冲突,可以自由为MyISAM表混合并行的INSERT和SELECT语句而不需要锁定。也就是说,你可以在其它客户正读取MyISAM表的时候插入行。如果数据文件中间不包含空闲块,不会发生冲突,因为在这种情况下,记录总是插入在数据文件的尾部。(从表的中部删除或更新的行可能导致空洞)。如果有空洞,当所有空洞填入新的数据时,并行的插入能够重新自动启用。
如果不能同时插入,为了在一个表中进行多次INSERT和SELECT操作,可以在临时表中插入行并且立即用临时表中的记录更新真正的表。
这可用下列代码做到:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> INSERT INTO real_table SELECT * FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;


InnoDB使用行锁定,BDB使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。
行级锁定的优点:
·         当在许多线程中访问不同的行时只存在少量锁定冲突。
·         回滚时只有少量的更改。
·         可以长时间锁定单一的行。
行级锁定的缺点:
·         比页级或表级锁定占用更多的内存。
·         当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
·         用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
在以下情况下,表锁定优先于页级或行级锁定:
·         表的大部分语句用于读取。
·         对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:
·                UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
·                DELETE FROM tbl_name WHERE unique_key_col=key_value;
·         SELECT 结合并行的INSERT语句,并且只有很少的UPDATE或DELETE语句。
·         在整个表上有许多扫描或GROUP BY操作,没有任何写操作。
不同于行级或页级锁定的选项:
·         版本(例如,为并行的插入在MySQL中使用的技术),其中可以一个写操作,同时有许多读取操作。这说明数据库或表支持数据依赖的不同视图,取决于访问何时开始。其它共同的术语是“时间跟踪”、“写复制”或者“按需复制”。
·         按需复制在许多情况下优先于页级或行级锁定。然而,在最坏的情况下,它可能比使用常规锁定使用更多的内存。
·         除了行级锁定外,你可以使用应用程序级锁定,例如在MySQL中使用GET_LOCK()和RELEASE_LOCK()。这些是建议性锁定,它们只能在运行良好的应用程序中工作。
0
0
分享到:
评论

相关推荐

    何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道

    这一点与传统理解可能有所不同,因为锁并非一开始就一次性持有所有可能需要的锁,而是在实际访问到待更新的数据行时才开始加锁。解锁则是在事务提交或回滚时进行。 #### 锁粒度 锁粒度决定了并发控制的严格程度和...

    mysql-常见问题,索引优化

    理解这些机制对于优化事务处理和故障恢复非常重要。 12. 幻读、脏读、不可重复读 这三种现象是事务隔离级别不充分时可能出现的问题。幻读指新插入的数据在事务内不可见;脏读是读取到未提交的修改;不可重复读则是...

    全面了解MySql中的事务

    MySQL提供了四种隔离级别来控制这一点: - 读未提交(READ UNCOMMITTED):允许脏读,事务能看到其他未提交的更改。 - 读已提交(READ COMMITTED):防止脏读,但可能出现不可重复读,即同一事务中两次读取同一...

    行业-53 理解MVCC机制的前奏:undo log版本链是个什么东西?l.rar

    MVCC通过为每个事务提供不同的数据视图来实现这一点,而undo log版本链是MVCC实现中的关键组件。本文将深入探讨undo log版本链的概念、作用以及它在MVCC中的具体应用。 首先,我们需要理解undo log。在数据库系统中...

    MySQL中从库延迟状况排查的一则案例

    总结来说,MySQL从库的延迟排查涉及到对复制机制的理解,对慢查询日志、二进制日志的分析,以及对InnoDB存储引擎状态的深入洞察。通过一系列的工具和命令,我们能够逐步定位到问题所在,进而进行有针对性的优化和...

    MySQL InnoDB如何保证事务特性示例详解

    理解这些机制对于优化MySQL数据库性能和解决并发问题至关重要。优化数据库硬件,如使用SSD固态硬盘,可以显著提升`fsync`操作的效率,进而改善事务提交的性能。同时,了解并合理设置`innodb_flush_log_at_trx_commit...

    Java面经(面试准备+面试场景)

    2. **并发编程**:在高并发环境下,Java的线程模型、锁机制、并发容器等知识尤为重要。理解并发原理,能有效地解决多线程问题。 3. **JVM**:理解JVM内存模型、垃圾回收机制、性能调优等,对于优化应用程序性能至关...

    数据库查询软件!!!!!!!!!!!!很好的

    6. 并发控制:在多用户环境下,如何保证数据的一致性和完整性,例如事务处理和并发控制机制(如锁机制)。 7. 数据库管理系统(DBMS):理解不同类型的DBMS,比如Oracle、Microsoft SQL Server、IBM DB2等,以及...

    C++ 开发 DB

    这可能涉及到线程同步机制,如互斥锁(mutexes)和条件变量(condition variables)。 5. **异常处理**:数据库操作常常会遇到错误,如连接失败、查询错误等。C++的异常处理机制可以帮助开发者优雅地处理这些错误,...

    酒店信息管理系统源代码

    这可能涉及到锁机制、乐观锁定或悲观锁定策略,确保数据的一致性和完整性。 7. **异常处理**:为了增强系统的稳定性和健壮性,必须捕获和处理可能出现的异常。C#提供了try-catch语句来实现这一点。 8. **报表生成*...

    MyBatis做读写分离

    3. **减少锁竞争**:写操作通常涉及更多的锁机制,将它们集中在主库上执行可以减少锁竞争,提高写操作的效率。 4. **提高数据可靠性**:通过主从复制机制,即使主库发生故障,也可以快速切换到从库,确保服务的连续...

    cpp-Redis分布式事务

    为了在分布式环境中实现这一点,我们可以利用Redis提供的某些特性,如单个命令的原子执行、发布/订阅机制、分布式锁等。这些工具可以帮助我们在不同节点间协调事务,保证在并发环境下也能正确执行。 在C++中与Redis...

    ChatRoom

    这可能涉及到锁机制或者数据库的事务处理。 8. **错误处理与日志记录**:良好的错误处理机制和日志记录能帮助开发者追踪并解决运行时的问题。JSP和Java都提供了相应的工具和技术来实现这一点。 9. **部署与测试**...

    python爬虫工程源码

    Python的`threading`和`multiprocessing`库可以帮助实现这一点,同时还要了解GIL(全局解释器锁)对Python多线程的影响。 7. **模拟登录**:许多网站需要登录后才能访问某些内容,爬虫需要模拟用户登录。这涉及到...

    2022米哈游-平台后端笔试.docx

    在并发编程中,通常通过信号量、互斥锁(mutex)等机制来实现。 ### 内存别名 内存别名是指在程序中不同的变量指向了同一块内存区域的现象。这种情况可能导致不可预测的行为,因为对一个变量的操作可能会影响另一...

    C# 仿QQ源代码 分享

    C#中的锁、Monitor、Mutex、Semaphore等机制可以帮助解决这些问题。 11. **错误处理**:良好的错误处理机制能确保程序在异常情况下能够恢复或提供有用的信息,C#的try-catch-finally结构是实现这一点的关键。 这个...

    Mybatis Update操作返回值问题

    乐观锁通过版本号或者时间戳等机制来防止并发问题。在这种情况下,如果一个更新操作返回的不是受影响的行数,而是匹配的行数,可能会导致误解。例如,如果第一次更新操作匹配了两条记录,但实际只有一条记录被修改,...

    《自己动手写网络爬虫》第四章代码

    - 并发编程需要注意锁机制、同步问题以及线程池的管理。 6. **分布式爬虫**: - 当单机爬虫无法满足需求时,可以构建分布式爬虫利用多台机器并行抓取。 - 云计算架构,如Hadoop或Spark,提供了解决大规模数据...

    MIPCMS 远程写入配置文件Getshell-1.pdf

    ### MIPCMS 远程写入配置文件Getshell 漏洞分析与...通过对漏洞原理的深入理解及采取相应的防御措施,可以有效降低此类安全风险,保护系统免受攻击。此外,持续的安全意识培训和技术更新也是保障信息系统安全的关键。

    老司机直播盒子源码可开启卡密售卖

    【标题解析】 ...综上所述,“老司机直播盒子源码可开启卡密售卖”是一个包含前后端开发、数据库管理、实时通信、安全策略等多个技术环节的综合项目,对于开发者来说,理解和掌握这些技术是实现该系统的关键。

Global site tag (gtag.js) - Google Analytics