2010-06-21 30 views
7

Các giao dịch SQL được sử dụng để chèn, cập nhật, nhưng nó được sử dụng để đọc các bản ghi?Tôi có nên sử dụng các giao dịch SQL, trong khi đọc các bản ghi?

+0

cảm ơn tất cả người trả lời, tôi muốn có tùy chọn đánh dấu tất cả là câu trả lời nhưng không có. cảm ơn bạn đã đưa ra các ví dụ, để cung cấp liên kết giải thích về khóa, để được giải thích về cách nhận dữ liệu cập nhật theo mili giây cảm ơn bạn. – user287745

Trả lời

8

Nếu bạn đang truy vấn tất cả các bản ghi trong một truy vấn, và kéo chúng trở lại trong một lần, không cần thiết. Mọi thứ được bao bọc trong một giao dịch ngầm định. Đó là để nói, ngay cả khi bạn lấy lại một triệu bản ghi, và ngay cả khi các quá trình khác đang thay đổi các bản ghi, bạn sẽ thấy tất cả một triệu bản ghi trông như thế nào tại cùng một thời điểm.

Lần duy nhất bạn thực sự cần giao dịch (và thường là gợi ý khóa cụ thể) trong quy trình chỉ đọc là:
- Bạn đọc bản ghi "bữa ăn từng phần" và không cần gì khác để thay đổi giá trị trong khi bạn itterate mặc dù. [Chẳng hạn như một recordset kết nối trong ADO mà bạn sau đó trỏ qua.]
- Bạn đọc một số dữ liệu, thực hiện một số phép tính, sau đó đọc một số dữ liệu liên quan, nhưng trên giả định không có gì thay đổi trong thời gian trung bình.


Tóm lại, bạn cần giao dịch khi bạn muốn quá trình khác để được dừng lại can thiệp với các dữ liệu của bạn giữa các câu lệnh SQL.

3

Không cần gói giao dịch để đọc thuần túy.

Trong câu lệnh SQL của bạn, Khóa gợi ý nên cẩn thận trả lại dữ liệu thích hợp cho bạn (http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx).

Ở cấp độ máy chủ, bạn có thể đặt cấp Cô lập giao dịch (http://msdn.microsoft.com/en-us/library/ms173763.aspx).

Sửa

Giải thích tinh khiết đọc

Nếu tất cả các câu lệnh SQL của bạn có các loại đọc sau đó bạn không cần phải bọc trong một giao dịch

SELECT Col1, Col2 
From Table1 
    INNER JOIN Table2 
     ON Table1.Id = Table2.Table1Id 

Nếu bạn đang đọc kết quả có thể bị ảnh hưởng bởi các giao dịch khác song song thì bạn phải gói trong một giao dịch. Ví dụ:

BEGIN TRANSACTION 

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21) 
UPDATE AccountSummary SET Balance = Balance + 43.21 

SELECT @Balance = Balance FROM AccountSummary 

COMMIT TRANSACTION 

Thực sự, bạn chỉ trả lại số dư, nhưng toàn bộ giao dịch tiền tệ phải hoạt động ở hai nơi.

+0

Trong ví dụ sau, bất kỳ quá trình đồng thời nào cũng có thể ảnh hưởng đến các bảng bạn đang đọc. Không có văn bản dữ liệu, nhưng có tính toán giữa các lần đọc có liên quan. Như vậy, một GIAO DỊCH sẽ cần phải bảo vệ trạng thái của dữ liệu. INSERT INTO @temp SELECT ; ; CHỌN ; – MatBailie

+0

Đó không phải là một bài đọc thuần túy. Raj nói: "Gói giao dịch là không cần thiết cho đọc thuần túy." –

+0

Xác định "đọc thuần túy", ví dụ tôi đưa ra không chèn, cập nhật hoặc xóa bất kỳ thứ gì ngoài biến. [Nó có thể là INT, một biến bảng hoặc một số vùng chứa dữ liệu khác để tạo điều kiện cho các phép tính sau đó sẽ xác định hành vi của lần đọc cuối cùng] – MatBailie

2

Nếu bạn cần cập nhật nhất cho thông tin về mili giây, bạn có thể sử dụng giao dịch được xây dựng với TransactionOptionsIsolationLevel của Serializable.

Điều này sẽ ảnh hưởng đến hiệu suất vì nó sẽ khóa bảng (hoặc một phần của bảng), vì vậy bạn cần phải tìm ra nếu bạn thực sự cần điều này.

Đối với hầu hết các lần sử dụng, nếu bạn đang đọc, bạn không cần phải quấn một giao dịch xung quanh nó (giả sử bạn chỉ đang đọc trong một thao tác).

Nó thực sự phụ thuộc vào ứng dụng của bạn, dữ liệu nào yêu cầu và cách dữ liệu sử dụng. Ví dụ, nếu bạn đọc và tùy thuộc vào kết quả bạn viết hoặc cập nhật, nhưng điều quan trọng là dữ liệu bạn vừa đọc là hiện tại, có lẽ bạn nên quấn toàn bộ logic vào một giao dịch duy nhất.

1

Không, các giao dịch thường không cần thiết để đọc dữ liệu và nó cũng sẽ làm chậm dữ liệu của bạn.

Tôi khuyên bạn nên đọc về thuật ngữ ATOMIC. Điều này sẽ giúp bạn hiểu những giao dịch nào.

1

Có thể thực hiện giao dịch nhưng mục đích của nó là gì?

Bạn có thể đặt mức cách ly thích hợp cho toàn bộ phiên SQL Server bằng cách sử dụng câu lệnh SET TRANSACTION ISOLATION LEVEL.

Đây là cú pháp của SQL server sách trực tuyến:

SET TRANSACTION ISOLATION LEVEL 
    { 
     READ COMMITTED 
     | READ UNCOMMITTED 
     | REPEATABLE READ 
     | SERIALIZABLE 
    } 

Locking in Microsoft SQL Server.

0

Khi bạn sửa đổi điều gì đó trong giao dịch, bạn có thể sử dụng câu lệnh đọc để kiểm tra xem thao tác có hiệu lực hay không, ngay trước khi bạn cam kết.

0

Giao dịch nhằm tránh các vấn đề tương tranh khi một giao dịch lôgic thực sự ánh xạ tới một số truy vấn SQL. Ví dụ, đối với một tài khoản ngân hàng, nếu bạn đang chuyển tiền từ tài khoản này sang tài khoản khác, bạn sẽ trừ số tiền đầu tiên khỏi tài khoản và sau đó thêm số tiền đó vào tài khoản khác (hoặc ngược lại). Tuy nhiên, nếu một số lỗi xảy ra ở giữa cơ sở dữ liệu của bạn sẽ ở trạng thái không hợp lệ (Bạn có thể đã trừ số tiền từ một tài khoản nhưng không được thêm vào số khác). Vì vậy, nếu bạn đang đọc tất cả dữ liệu của bạn trong một truy vấn, bạn không cần một giao dịch.

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