2012-03-23 28 views
6

Tôi đang cố gắng chứng minh một đọc ảo trong MySQL thông qua việc sử dụng JDBC. Tôi hiểu rằng dưới mức cô lập REPEATABLE-READ, các câu lệnh có thể được thực hiện. Nhưng tôi không thể có một chuyện xảy ra. giao dịch của tôi được thiết lập như sau:cố gắng tạo một hình ma trong MySQL theo mức cách ly REPEATABLE-READ

giao dịch 1:

querySetOne[0] = "use adventureworks"; 
querySetOne[1] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[2] = "select sleep(20)"; 
querySetOne[3] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[4] = "COMMIT"; 

giao dịch 2:

querySetTwo[0] = "use adventureworks"; 
querySetTwo[1] = "select sleep(2)"; 
querySetTwo[2] = "insert into vendorcontact values (105, 700, 20, NULL)"; 
querySetTwo[3] = "COMMIT"; 

tôi có chúng trong mảng b/c Tôi đang sử dụng Statement.execute() phương pháp để thực hiện mỗi dòng và tôi có autocommit thiết lập để sai.

Tại sao truy vấn từ querySetOne [1] và querySetOne [3] trả về cùng một kết quả theo mức độ cô lập đọc lặp lại ??

+0

Đọc câu hỏi này: [Cách tạo ra số lần đọc ma?] (Http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) –

Trả lời

0

Phantoms không thể thực hiện với REPEATABLE READ. Phantoms là hệ quả của READ COMMITTED. Đó là sự khác biệt chính giữa RR và RC. Gần đây tôi đã viết một bài đăng trên blog giải thích hai mức cách ly, vì chúng thường bị nhầm lẫn: http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

OK, tôi đã chuyển công cụ cơ sở dữ liệu đến MyISAM. Bây giờ tất cả các mức cô lập có thể (và làm) tạo ra một bóng ma ... Tại sao mức cô lập SERIALIZABLE tạo ra các phantoms trong MyISAM, nên nó vẫn không chặn giao dịch thứ 2 cho đến khi lần đầu tiên kết thúc ?? – user1251858

+0

MyISAM không phải là một công cụ lưu trữ giao dịch, vì vậy REPEATABLE READ/READ COMMITTED/etc không có hiệu lực. Từ các công cụ đi kèm với MySQL theo mặc định, bạn phải sử dụng InnoDB. –

3

Chuẩn SQL có thể chỉ ra rằng đọc ảo có thể đọc được, nhưng không được yêu cầu.

Cụ thể, công cụ InnoDB của MySQL hỗ trợ consistent reads dưới sự cô lập đọc lặp lại, có nghĩa là lần đọc đầu tiên trong giao dịch tạo ảnh chụp nhanh và đọc lại sau trong giao dịch sử dụng cùng một ảnh chụp.

Các MySQL documentation nói này về lặp lại cách ly đọc:

Tất cả phù hợp đọc trong cùng một giao dịch đọc ảnh chụp thành lập bởi đọc đầu tiên. Quy ước này có nghĩa là nếu bạn phát hành một số câu lệnh SELECT đơn giản (không khóa) trong cùng một giao dịch, các phát biểu SELECT này nhất quán cũng liên quan đến nhau.

Các vấn đề liên quan