我有一个事务,在数据库上读取一个,然后写入一个。如果我在MySQL中选择MyIsam作为我的数据库引擎,那么MyIsam的表级锁定机制可以保证,一旦事务开始读取,表就会被所有其他事务锁定?
我的意思是如果有两个或更多交易,我希望它们按此顺序:
R W R W R W R W R W...
但如果这些按此顺序完成:
R R R R W W W W....
我的数据库进入不一致状态。这是此特定表格中的特定要求。让桌子MYIsam足够吗?如果不是我还需要做什么?表级锁定仅适用于写入吗?
答案 0 :(得分:2)
MySQL文档声明:
LOCK TABLES不是交易安全的 并隐式提交任何活动的 尝试锁定之前的事务 表格。
开始交易(例如, 使用START TRANSACTION)隐含地 提交任何当前交易和 释放现有锁。
但这些规定适用于交易引擎(InnoDB)。 MyISAM不支持InnoDB样式的事务。
MyISAM具有读锁(可防止来自任何会话的写入)和写锁(阻止来自其他会话的读写)。多个会话可以获取读锁定,但是如果一个会话获得写锁定,则在写锁定到位时,其他会话无法读取,锁定或写入该表。
我鼓励您consult the docs关于该主题,以及链接到我链接到的页面顶部的那些页面。很抱歉,该链接指的是特定的版本号;我不知道链接到MySQL文档的版本无关的方法。
听起来我觉得你需要获得写锁定,并在锁定处于活动状态时进行读/写,然后释放它,然后继续执行下一步。如果您是第一次获得读锁定,请执行读取,然后释放并获取写锁定,即可显示竞争条件。