插入唯一文本需要什么最低隔离级别?

时间:2016-10-18 19:53:31

标签: mysql sql database isolation-level

我有一个带有文本列的表,我想要一个唯一性保证。由于我无法在文本列上添加唯一约束,因此我希望使用事务来包围我的插入,以确保唯一性保证。

我的问题是:此保证需要的最低隔离级别是什么?

1 个答案:

答案 0 :(得分:2)

没有使用确保唯一性的交易。

为此使用UNIQUE约束。

但是你不能创建超过768字节的任何索引,包括唯一索引。这意味着您不能对长字符串数据类型(例如TEXTVARCHAR超过一定长度等)设置唯一约束。

您可以使用前缀索引使长字符串的前导部分唯一。

ALTER TABLE MyTable ADD UNIQUE KEY (textfield(255));

另一种确保唯一性的方法是在现有行中搜索要插入的值,并且只有在找不到它时才插入新值。

但这要求您拥有对表的独占访问权限,以防止另一个并发会话尝试插入相同值的竞争条件。

这也与事务隔离级别无关。即使SERIALIZABLE隔离级别也无法帮助您避免竞争条件。阅读http://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html,其中写着:

  

[SERIALIZABLE]与REPEATABLE READ类似,但如果禁用自动提交,InnoDB会将所有普通SELECT语句隐式转换为SELECT ... LOCK IN SHARE MODE

因此,如果多个会话同时尝试读取表以检查重复值,则允许它们,因为共享锁不会阻止其他共享锁。然后他们可能所有决定插入新值是安全的,并且你有重复。

要在阅读表格时获得排他锁定,请明确使用SELECT ... FOR UPDATE。但您可以在任何事务隔离级别执行此操作。