mysql - 表级锁定保证什么?

标签 mysql database performance myisam

我有一个事务,它对数据库进行一次读取,然后进行一次写入。如果我选择 MyIsam 作为我在 MySQL 中的数据库引擎,MyIsam 的表级锁定机制是否可以保证,一旦事务开始读取,该表就会被所有其他事务锁定?

我的意思是如果有两笔或更多笔交易,我希望它们按以下顺序排列:

R W R W R W R W R W... 

但是如果按照这个顺序完成的话:

R R R R W W W W....

我的数据库进入不一致状态。这是对该特定表的特定要求。制作表格 MYIsam 是否足够?如果不是,我还需要做什么?表级锁定是否仅适用于写入?

最佳答案

MySQL 文档指出:

  • LOCK TABLES 不是事务安全的 并隐式提交任何事件 尝试锁定之前的交易 表格。

  • 开始交易(例如, 与 START TRANSACTION) 隐式 提交任何当前事务和 释放现有的锁。

但是这些规定适用于事务引擎 (InnoDB)。 MyISAM 不支持 InnoDB 样式的事务。

MyISAM 有读锁(这将阻止来自任何 session 的写入)和写锁(这将阻止来自其他 session 的读写)。多个 session 可以获得读锁,但如果一个 session 获得写锁,则在写锁就位时,其他 session 无法读取、锁定或写入表。

我鼓励你consult the docs关于该主题,以及我链接到的页面顶部链接到的那些页面。抱歉,链接指向特定版本号;我不知道与版本无关的方式来链接到 MySQL 文档。

在我看来,您需要获得写锁,并在锁处于事件状态时执行读/写操作,然后释放它,然后继续下一步。如果您要先获取读锁,执行读操作,然后释放并获取写锁,就会暴露竞争条件。

关于mysql - 表级锁定保证什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320247/

相关文章:

python - 读取大文件并制作字典

python - 在 python 中创建包含所有条目和相应迭代器差异的列表的最快方法

php 表单未将日期发送到数据库 SQL

php - 如何在 PHP/MySQL Web 应用程序中安全地为用户提供新密码?

mysql - 我的数据库设计缺陷...请解释一个更好的方法...((正确的方法))

java - 有没有一种简单的方法可以在 Oracle 中克隆表的结构?

c# - 正则表达式匹配需要很长时间才能执行

mysql - 如何将此 sql 转换为 sqlalchemy 查询? (MySQL 中的年、月、计数)

mysql - 如何多次生成同一行?

php - 在 laravel 中回滚无效