- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
编辑:我在这里找到了解决方案 http://mysql.bigresource.com/Track/mysql-8TvKWIvE/假设 select 需要很长时间才能执行,这是否会长时间锁定表?
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;START TRANSACTION;SELECT foo FROM bar WHERE wee = 'yahoo!';DELETE FROM bar WHERE wee = 'yahoo!';COMMIT;
我希望使用一个条件来选择 mysql 中的行,将它们作为结果集返回到我的应用程序,然后删除这些行。如何才能做到这一点?我知道我可以执行以下操作,但效率太低:
select * from MyTable t where _critera_.//get the resultset and thendelete from MyTable t where t.id in(...result...)
我需要使用交易吗?有单一的查询方案吗?
最佳答案
我需要根据某些条件SELECT
一些行,对数据做一些事情,然后原子地DELETE
那些相同的行,也就是说,没有 删除所有符合条件但插入到 SELECT
之后的行。
与其他答案相反,REPEATABLE READ
是不足够的。引用Consistent Nonlocking Reads .特别注意这个标注:
The snapshot of the database state applies to
SELECT
statements within a transaction, not necessarily to DML statements. If you insert or modify some rows and then commit that transaction, aDELETE
orUPDATE
statement issued from another concurrentREPEATABLE READ
transaction could affect those just-committed rows, even though the session could not query them.
你可以自己试试:
首先创建一个表:
CREATE TABLE x (i INT NOT NULL, PRIMARY KEY (i)) ENGINE = InnoDB;
启动事务并检查表(现在称为 session 1):
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM x;
开始另一个 session ( session 2)并插入一行。 请注意此 session 处于自动提交模式。
INSERT INTO x VALUES (1);
SELECT * FROM x;
您将看到新插入的行。然后再次回到 session 1:
SELECT * FROM x;
DELETE FROM x;
COMMIT;
在 session 2 中:
SELECT * FROM x;
您会看到,即使您从 session 1 中的 SELECT
中没有得到任何信息,您也会删除一行。在 session 2 中,您将看到最后的表格是空的。请特别注意 session 1 的以下输出:
mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM x;
Empty set (0.00 sec)
/* --- insert in session 2 happened here --- */
mysql> SELECT * FROM x;
Empty set (0.00 sec)
mysql> DELETE FROM x;
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM x;
Empty set (0.00 sec)
此测试是使用 MySQL 5.5.12 完成的。
SERIALIZABLE
事务隔离级别。但是请注意, session 2 将在 INSERT
上阻塞。SELECT...FOR UPDATE
也能解决问题。我没有 100% 深入研究手册来理解这一点,但是当我尝试它时它起作用了。优点是您不必更改事务隔离级别。同样, session 2 将在 INSERT
上阻塞。SELECT
之后单独删除行。基本上,您必须在 SELECT
中包含一个唯一的列(最好是主键),然后使用 DELETE FROM x WHERE i IN (...)
,或类似的东西,其中 IN
包含来自 SELECT
结果集的键列表。优点是你根本不需要使用事务, session 2 不会在任何时候被阻塞。缺点是你有更多的数据来回发送到 SQL 服务器。此外,我不知道单独删除行是否与使用与原始 SELECT
相同的 WHERE
子句一样有效,但如果原始 SELECT
的 WHERE
子句很复杂或很慢,单个删除可能会更快,因此这可能是另一个优势。社论,这是非常危险的事情之一,即使它被记录在案,它也几乎可以被认为是一个“错误”。但是,嘿,MySQL 的设计者并没有问我(或者其他任何人,显然)。
关于mysql选择删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4912220/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!