2010-06-23 17 views
26

Đâu là điểm để kèm theo các câu lệnh chọn trong một giao dịch? Tôi nghĩ rằng các câu lệnh chọn chỉ là dữ liệu "GET" từ cơ sở dữ liệu, chúng không có cơ hội để khôi phục lại một cái gì đó, bởi vì bạn không thể thay đổi dữ liệu. Vì vậy, để nói rằng chúng ta không bao giờ cần đặt câu lệnh chọn trong một giao dịch? Tôi có đúng không?Đâu là điểm để kèm theo các câu lệnh chọn trong một giao dịch?

Cảm ơn.

Trả lời

31

Bạn nói đúng: theo tiêu chuẩn isolation level, read committed, bạn không cần phải quấn các câu lệnh chọn trong giao dịch. Chọn câu lệnh sẽ được bảo vệ khỏi đọc bẩn nếu bạn quấn chúng trong một giao dịch hay không.

connection 1:       connection 2: 

             begin transaction 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1 
             rollback transaction 

Câu lệnh chọn sẽ không đọc bản cập nhật được cuộn lại: không quan trọng là chúng không được gói trong giao dịch.

Nếu bạn cần repeatable reads, sau đó gói chọn trong một giao dịch mặc định không giúp:

connection 1:       connection 2: 

begin transaction 
select name from users where id = 1 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1 
commit transaction 

Các begincommit tuyên bố sẽ không giúp đỡ ở đây: thứ hai selectthể đọc tên cũ, hoặc số có thể đọc tên mới.

Tuy nhiên, nếu bạn chạy ở mức độ cô lập cao hơn, như serializable hoặc repeatable read, nhóm sẽ được bảo vệ khỏi không lặp lại lần đọc:

connection 1:       connection 2: 

set transaction isolation level 
    repeatable read 
begin transaction 
select name from users where id = 1 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1    | 
commit transaction        | 
               |--> executed here 

Trong kịch bản này, các update sẽ chặn cho đến khi giao dịch đầu tiên hoàn tất.

Mức cô lập cao hơn hiếm khi được sử dụng vì chúng làm giảm số lượng người có thể làm việc trong cơ sở dữ liệu cùng một lúc. Ở cấp cao nhất, serializable, truy vấn báo cáo sẽ tạm dừng mọi hoạt động cập nhật.

+0

Về đoạn cuối cùng của bạn, ** Tại sao khối cập nhật? ** Không thể cập nhật sẽ vẫn đi qua mà không chặn, nhưng giao dịch đầu tiên được đọc lặp lại, vẫn sẽ tiếp tục làm việc với các giá trị cũ ? – Pacerier

+0

@Pacerier: Đọc lặp lại nói rằng nếu bạn đọc hai lần, lần đọc thứ hai sẽ trả về cùng một kết quả. Không giống như Oracle hoặc PostgeSQL, SQL Server không giữ các giá trị cũ xung quanh. Bạn có thể thay đổi hành vi này bằng ['SET READ_COMMITTED_SNAPSHOT ON'] (http://msdn.microsoft.com/en-us/library/ms345124.aspx). – Andomar

+0

Hmm, đây là kỳ quặc, có vẻ là mặc định trên MySQL. Vì vậy, đối với máy chủ sql, sau khi chạy 'set read_committed_snapshot on', có quyền nói rằng" cập nhật "sẽ ** không còn ** chặn không? – Pacerier

7

Bạn có thể đang thực hiện các cập nhật/phụ trang khác trong giao dịch này. Nếu mã của bạn truy cập vào cơ sở dữ liệu được viết theo kiểu tái sử dụng thì bạn có thể không chọn lựa là điều duy nhất xảy ra trong giao dịch.

Báo cáo lựa chọn của bạn có thể muốn nhất quán trong suốt thời gian giao dịch, cũng như nhất quán với các thay đổi dữ liệu xảy ra trong các giao dịch khác. Bạn sẽ muốn đặt một số loại isolation level trong hệ thống của bạn để ngăn chặn đọc bẩn (đọc các thay đổi không được cam kết trong giao dịch khác) hoặc đọc ảo (đọc các thay đổi đã cam kết trong giao dịch khác).

Không cần phải nói, bạn sẽ được phục vụ tốt hơn bằng cách sử dụng giao dịch.

4

No.

Giao dịch cung cấp cho bạn cái nhìn nhất quán về cơ sở dữ liệu.

Nếu bạn muốn các lựa chọn của mình trả lại kết quả tương tự khi bạn lặp lại chúng, giao dịch có thể cung cấp.

4

Bạn có thể không thay đổi dữ liệu, nhưng một số kết nối cơ sở dữ liệu khác có thể.

1

Nếu bạn chắc chắn rằng tất cả những gì đang xảy ra là một CHỌN, thì nó không cần phải có trong một giao dịch. Bạn có chắc chắn 100% rằng bây giờ và mãi mãi hơn nó sẽ chỉ là một CHỌN?

5

Một câu lệnh SELECT đơn lẻ bắt đầu bằng - kèm theo nó trong giao dịch là dư thừa. Nếu có nhiều câu lệnh SELECT, bạn được đảm bảo rằng không ai thay đổi bất cứ điều gì ảnh hưởng đến bất kỳ câu lệnh nào trong số họ cho đến khi tất cả chúng hoàn thành.

2

Một lý do khác để sử dụng các giao dịch với một chọn:

Có thể tại một số điểm bạn có thể muốn gọi chọn phương pháp của bạn từ các phương pháp khác được tham gia vào một giao dịch và bạn muốn chọn để tham gia vào giao dịch vãng lai . Nếu bạn có một thiết kế nhất quán trong đó tất cả các hành động cơ sở dữ liệu được thực hiện trong một giao dịch thì người gọi của bất kỳ phương thức nào biết rằng nó sẽ tham gia vào giao dịch của họ.

Với chi phí phát triển nhỏ hơn, điều này có thể giúp tránh một số thay đổi khá lớn sau khi cố gắng lắc đầu giao dịch nếu/khi yêu cầu thay đổi hoặc yêu cầu mới được thêm vào.

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