我试图理解事务是如何工作的,我遇到了一个对我来说没有多大意义的场景。我希望有人能帮我理解它。
我有两笔交易
事务1
BEGIN; update data set val = val + 1 where id = 1
事务2
BEGIN; select * from data
我打开了两个终端,开始第一个事务并运行更新查询。这假定为id为1的元组上的事务1提供了独占锁。
然后,在提交第一个事务之前,我在另一个终端中运行第二个查询。我预计它会停止,因为第一个事务具有排它锁,这将阻止该事务获取id为1的元组上的读锁。
但是,mysql运行select查询并返回“非脏”数据。
有人能给我解释一下my
我不明白两个重复查询,每个查询使用主键删除单个表上的一行,怎么会死锁。有谁能解释一下吗?
在我看来,其中一个事务应该获得锁,而另一个事务则必须等待。
以下是死锁报告,以及查询:
Fri Jun 01 2012 13:50:23
*** (1) TRANSACTION:
TRANSACTION 3 1439005348, ACTIVE 0 sec, process no 22419, OS thread id 1166235968 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), hea
SQL Server:如何持有select查询的排它锁?对于mysql,
select * from Employee e
where e.id=123
for update
其他并发事务无法读取或写入所选行。
如何在SQL server上实现同样的功能?
SELECT *
FROM Employee e
WITH (HOLDLOCK, ROWLOCK)
WHERE e.id = 123;
对于(HOLDLOCK,row LOCK ),它是否持有所选行的读锁定?有了读锁,其他事务仍然可以读取锁定的行,对吗?
我有一个非常慢的查询,需要不时地在MySQL数据库上运行。
我发现更新正在查询的表的尝试会被阻止,直到查询完成。
我想这是有意义的,因为否则查询的结果可能不一致,但对我来说并不理想,因为查询的重要性要比更新低得多。
所以我的问题有两部分:
出于好奇,MySQL在这种情况下到底做了什么?它是否在查询期间锁定表?还是试着在更新之前锁定它?
是否有办法使缓慢的查询不阻塞?我想可能的选择是:
- Kill the query when an update is needed.
- Run the query on a copy of the table as it was just b
每次我使用MySQL的CREATE TABLE AS SELECT ...时,从其中选择的所有表/索引都是在查询的持续时间()锁定的。我真的不明白为什么?有办法绕过这件事吗?
使用: MySQL 5.1.41和InnoDB
添加了示例:
例如,以下查询可能需要10分钟才能完成:
CREATE TABLE temp_lots_of_data_xxx AS
SELECT
a.*
b.*
c.*
FROM a
LEFT JOIN b ON a.foo = b.foo
LEFT JOIN c ON a.foo = c.foo
在上述查询期间尝试更新表a、b或c中的值将等待上述
每隔一段时间我就会收到一个mysql错误。错误是
Deadlock found when trying to get lock; try restarting transaction
查询为
var res = cn.Execute("insert ignore into
Post(desc, item_id, user, flags)
select @desc, @itemid, @userid, 0",
new { desc, itemid, userid });
这个问题究竟是如何导致它的呢?在谷歌搜索时,我看到了一些关于查询如何占用很长的锁行
这类问题已经张贴了几次,但在以下情况下所提供的解决办法并不理想。在第一个查询中,我选择执行第一个查询时已知存在的表名。然后,在循环遍历它们时,我希望查询所选表中的记录数,但前提是它们仍然存在。问题是,在循环期间,一些表被另一个脚本删除。例如:
SELECT tablename FROM table
-- returns say 100 tables
while (%tables){
SELECT COUNT(*) FROM $table
-- by the time it gets to the umpteenth table, it's been dropped
MySQL 5.6关于可重复读取隔离级别的文档
这意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。
反向(有些)担保也成立吗?也就是说,尚未阅读的任何记录,是否将是其自身的最新版本?我真正想要理解的是,在MySQL中,在启动事务和查询锁(SELECT ... FOR UPDATE)之间是否存在获取数据中的竞争条件的可能性?
示例:
Transaction 1 Transaction 2
begin
begi
SELECT查询可以阻止INSERT / ALTER查询吗?
我的从数据库中有以下内容(摘自ENGINE INNODB STATUS):
---TRANSACTION 26DA7060, not started
mysql tables in use 5, locked 12
MySQL thread id 516232, OS thread handle 0x7fcf8304a700, query id 350388626 event_scheduler Waiting for table metadata lock
ALTER TABLE xxxxxxxxxxxx REORGANIZE P
我的网站有问题..。在过去的几天里,随机的时候网站变得非常缓慢。我开始尽我所能去调查。我看到MySQL进程使用了服务器可用内存的85-95%。(我也应该升级我的记忆吗?)
我检查了我的MySQL进程日志,我注意到了一个巨大的查询列表:Waiting for table level lock
但我也注意到,所有这些与“表级锁”有关的查询,仅仅是与我的表“用户”有关的查询。
我有另外20个表,有不断的查询,但我没有看到它们在列表上。所以我想问题就出在users表上了?
我想知道如何改进表,并最终删除表级锁?
我还运行了这个:
SHOW VARIABLES LIKE 'query_cache
我只是在编写一个复杂的更新查询,该查询大致如下所示:
update table join
(select y, min(x) as MinX
from table
group by y) as t1
using (y)
set x = x - MinX
这意味着变量x是基于子查询更新的,该查询还处理变量x --但是不能通过运行的update命令修改吗?这不是个问题吗?我的意思是,在正常编程中,您通常必须显式地处理这个问题,即将新值从旧值存储到其他地方,在工作完成后,用新的.但是,SQL数据库将如何做到这一点?
我对任何一个观察或实验都不感兴趣。我想要一个来
我计划编写以下查询:
INSERT INTO summary (user_id, total_points, count_operations)
SELECT
15 AS user_id,
(SELECT SUM(points) FROM operations WHERE user_id = 15) AS total_points,
(SELECT COUNT(*) FROM operations WHERE user_id = 15) AS count_operations
ON DUPLICATE KEY UPDATE
total_points = VALUES(tot
当为一个相对较小的查询调用mysql_query()时,我会得到PHP错误,所以我必须将限制设置为10。
Fatal error: Maximum execution time of 120 seconds exceeded in C:\xampp\htdocs\data.php on line 19
我已经从代码中删除了循环,代码似乎挂在mysql_query()函数上。
mysql_connect("192.168.50.250",$username,$password);
@mysql_select_db($database) or die( "Unable t