更改表而不锁定整个表

时间:2016-02-16 05:33:40

标签: mysql

public boolean deletesinglerow(String rowid) {
    SQLiteDatabase obj = this.getWritableDatabase();

    //return  obj.delete(TABLE_NAME,"ID = ?",new String[]{rowid});
    if (obj.delete(TABLE_NAME, "ID = ?", new String[]{rowid}) >0) {
        return true;
    } else {
        return false;
    }
}

锁定整个表?

1 个答案:

答案 0 :(得分:51)

简短回答:对于MySQL<需要5.6锁。从5.6开始,使用InnoDB,locks are not required for many ALTER TABLE operations including adding a column

如果您使用的是MySQL 5.5或更早版本,它将获得整个操作的读锁定,然后在最后进行简短的写锁定。

From the MySQL documentation for ALTER TABLE ...

  

在大多数情况下,ALTER TABLE生成原始表的临时副本...当ALTER TABLE正在执行时, 原始表可由其他会话读取 (与短暂的例外)。对ALTER TABLE操作开始后开始的表的更新和写入将停止,直到新表准备就绪...

     

前面提到的异常是ALTER TABLE阻止在准备好安装表.frm文件的新版本时读取(而不仅仅是写入),丢弃旧文件,并从中清除过时的表结构。表和表定义缓存。此时,它必须获得独占锁。

也就是说,在添加列时,它会读取大部分操作的表,然后在结尾处获得写锁定。

MySQL 5.6将Online DDL添加到InnoDB,它可以加速和改进许多内容,例如更改表和索引。向表中添加列将不再需要表锁except brief exclusive locks at the start and end of the operation

应该自动发生,但要确保将ALGORITHM=inplaceLOCK=none设置为ALTER TABLE声明。

有一个例外......

  

在MySQL 5.6之前创建的InnoDB表不支持ALTER TABLE ... ALGORITHM = INPLACE用于包含时间列(DATE,DATETIME或TIMESTAMP)的表,并且尚未使用ALTER TABLE ... ALGORITHM = COPY重建。