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;
}
}
锁定整个表?
答案 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=inplace
和LOCK=none
设置为ALTER TABLE
声明。
有一个例外......
在MySQL 5.6之前创建的InnoDB表不支持ALTER TABLE ... ALGORITHM = INPLACE用于包含时间列(DATE,DATETIME或TIMESTAMP)的表,并且尚未使用ALTER TABLE ... ALGORITHM = COPY重建。