我在早些时候使用事务时遇到了一些问题。希望有人能帮我弄明白。我会感谢任何帮助。谢谢。使用索引列和非索引列来更新来自不同事务的数据有什么区别?
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(),打破(在Eclipse中设置断点)在D
- 执行方法2()并发
请注意,“someid”不在索引中,但它存储与“id”完全相同的数据。
然后,我只有等待,只要我不提交交易1,或者最终交易超时就结束。但如果我改变了从哪里条款到F id = 1,它会工作得很好,没有任何等待。在这里我感到困惑,因为我没有锁定该表或任何行。如果我这样做,不应该这样做,对吧?
有人可以告诉我为什么会发生这种情况吗?谢谢!
谢谢你的回复!这对于更新是如何实现是有意义的,至少我认为是这样。嗯,我对交易并不熟悉,但相信隔离级别会影响更新声明,至少对我来说很难相信:-) – redfoxlee 2012-02-05 11:05:20
btw:好像隔离级别会影响锁定模式。但在这种情况下,我看不到READ COMMITED和REPEATABLE READ之间的区别。 – redfoxlee 2012-02-05 15:05:34