我有一个事务,它对数据库进行一次读取,然后进行一次写入。如果我选择 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/