gpt4 book ai didi

mysql - 使用索引列和非索引列更新不同事务中的数据有什么区别?

转载 作者:行者123 更新时间:2023-11-29 08:58:57 25 4
gpt4 key购买 nike

我之前使用交易时遇到了一些问题。希望有人能帮我弄清楚。我将不胜感激任何帮助。谢谢。

MySql表结构:

create table test (
id int not null,
someid int,
name varchar(50),
update_date datetime
);
primary key : id (auto-inc)
index1 : id (unique)
index2 : id, update_date (non-unique)

java方法:

// consider this method is Transaction 1
method1() {
A. set session transaction isolation level read commited;
B. select update_date from test where someid = 1;
C. insert into test values (some new data..);
D. select update_date from test where someid = 1;
}

// consider this method is Transaction 2
methodb() {
E. (start with default transaction isolation level - repeatable read)
F. update test set udpate_date = now() where someid = 1;
}

这就是我所做的:

  1. 执行method1()并在D处break(在eclipse中设置断点)
  2. 并发执行method2()

请注意,“someid”不在索引中,但它存储的数据与“id”完全相同。

然后,只要我不提交事务,我就只能等待,否则最终会导致事务超时。但是如果我将 where 子句更改为 F 的 id = 1,它将正常工作,无需任何等待。在这里我很困惑,因为我没有锁定该表或任何行。如果我这样做了,就不应该这样做,对吗?

谁能告诉我为什么会这样?谢谢!

最佳答案

条件someId=1需要数据库系统扫描全表,因为没有索引。 insert 语句可能会插入 someid=1 的行,从而影响第二个事务的结果。

通过where id=1,数据库可以确定只有一行受到语句F的影响。insert语句不会改变这一行。

我只是想知道,隔离级别是否会影响执行?

关于mysql - 使用索引列和非索引列更新不同事务中的数据有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com