我在早些時候使用事務時遇到了一些問題。希望有人能幫我弄明白。我會感謝任何幫助。謝謝。使用索引列和非索引列來更新來自不同事務的數據有什麼區別?
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