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?
Trả lời
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.
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.
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
Đó 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." –
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
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 TransactionOptions
có IsolationLevel
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.
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.
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
}
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.
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.
- 1. Tôi nên sử dụng gợi ý khóa nào (T-SQL)?
- 2. Khi nào tôi nên sử dụng các loại bản ghi nâng cao trong Delphi thay vì các lớp học?
- 3. Đọc nhật ký giao dịch SQL Server
- 4. Khi nào cần sử dụng Giao dịch trong SQL Server
- 5. Tôi có nên trích dẫn các số trong SQL không?
- 6. Sử dụng các giao dịch với subsonic
- 7. Khi nào tôi nên sử dụng Trình tạo giao diện?
- 8. Tôi có thực sự cần sử dụng các giao dịch trong các thủ tục được lưu trữ không? [MSSQL 2005]
- 9. Tôi nên sử dụng trình quản lý giao dịch nào cho mẫu JBDC Khi sử dụng JPA?
- 10. Khi nào tôi nên sử dụng kiểu trừu tượng trong các hệ thống nhúng
- 11. Khi nào tôi nên xác thực hóa đơn giao dịch mua hàng trong ứng dụng?
- 12. python - tôi có nên sử dụng các phương thức tĩnh hoặc các hàm mức cao nhất
- 13. Khi nào tôi nên sử dụng các đoạn trong ứng dụng Android? Tại sao sử dụng các mảnh?
- 14. Giao dịch Apache: ghi tệp giao dịch - cách sử dụng tài nguyênId
- 15. Khi nào sử dụng EXCEPT như trái ngược với KHÔNG tồn tại trong SQL giao dịch?
- 16. Lỗi giao dịch Sql
- 17. Khi nào tôi không nên sử dụng dấu chấm phẩy?
- 18. Trong Objective-C, khi nào tôi nên sử dụng các phương thức lớp và khi nào tôi nên sử dụng các phương thức instance?
- 19. Tôi có nên mô tả các dịch vụ REST ở định dạng máy có thể đọc được không?
- 20. Khi nào bạn nên sử dụng JCR và khi nào bạn nên sử dụng JPA/RDBMS?
- 21. Có nên đọc nhiều lần chỉnh sửa Clojure trong giao dịch để nhất quán không?
- 22. Cách sử dụng giao dịch (bắt đầu giao dịch, giao dịch cam kết)?
- 23. Tôi có nên biên dịch trước các trang ASP.NET 2.0 trước khi triển khai hay không?
- 24. Khi nào tôi nên sử dụng Bảng chỉ mục của Oracle? Hoặc, khi tôi không nên?
- 25. Sql Server 2008 Điều chỉnh với các giao dịch lớn (700k + hàng/giao dịch)
- 26. Quản lý dữ liệu lõi Bản ghi giao dịch iCloud
- 27. Khi nào tôi nên sử dụng ConcurrentSkipListMap?
- 28. Khi nào tôi nên sử dụng cú pháp bản ghi để khai báo dữ liệu trong Haskell?
- 29. SQL Server 2008: tôi có nên sử dụng auth Windows hoặc auth SQL Server không?
- 30. Tại sao nên sử dụng các dấu vết trong khi tôi đang sử dụng các dấu phẩy?
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