2012-09-11 30 views
6

Tôi lồng tiếng một số SP tại nơi làm việc và tôi đã phát hiện ra rằng bất cứ ai đã viết mã sử dụng một giao dịch trên báo cáo cập nhật đơn như thế nàySử dụng giao dịch trên báo cáo cập nhật đơn

begin transaction 
*single update statment:* update table whatever with whatever 
commit transaction 

Tôi hiểu rằng điều này là sai vì giao dịch được sử dụng khi bạn muốn cập nhật nhiều bản cập nhật. Tôi muốn hiểu từ điểm lý thuyết, các hàm ý của việc sử dụng mã như trên là gì? Có bất kỳ sự khác biệt nào trong việc cập nhật bất kỳ bảng nào có và không có giao dịch không? Có bất kỳ ổ khóa thêm hoặc một cái gì đó?

+1

Đó là một giao dịch với một câu lệnh duy nhất. Có thể nhà phát triển ban đầu nghĩ rằng các báo cáo/hành động bổ sung có thể được yêu cầu trong tương lai. –

Trả lời

5

Có lẽ giao dịch đã được bao gồm do mã trước đây hoặc có thể trong tương lai mà có thể bao gồm các dữ liệu khác. Có lẽ nhà phát triển đó chỉ đơn giản là tạo thói quen gói mã trong giao dịch, để 'an toàn'?

Nhưng nếu tuyên bố theo nghĩa đen chỉ liên quan đến một bản cập nhật duy nhất cho một hàng, thì thực sự không có lợi ích cho mã đó trong trường hợp này. Một giao dịch không nhất thiết phải 'khóa' bất cứ thứ gì, mặc dù các hành động được thực hiện bên trong nó có thể, tất nhiên. Nó chỉ đảm bảo rằng tất cả các hành động chứa trong đó được thực hiện tất cả hoặc không có gì.

Lưu ý rằng giao dịch không phải là về nhiều bảng - đó là về nhiều bản cập nhật . Đảm bảo rằng nhiều cập nhật xảy ra tất cả hoặc không.

Vì vậy, nếu bạn đang cập nhật cùng một bảng hai lần, sẽ có sự khác biệt khi có hoặc không có giao dịch. Nhưng ví dụ của bạn chỉ hiển thị một câu lệnh cập nhật, có lẽ chỉ cập nhật một bản ghi duy nhất.

Thực tế, các giao dịch có thể đóng gói nhiều bản cập nhật cho cùng một bảng. Hãy tưởng tượng những điều sau đây:

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200) 
INSERT INTO Transactions (AccountNum, Amount) values (2, -200) 

Điều đó nên được bao bọc trong giao dịch, để đảm bảo rằng tiền được chuyển chính xác. Nếu một thất bại, rất nhiều khác.

+0

Câu hỏi đặt ra là: Có sự khác biệt nào giữa một bản cập nhật duy nhất có và không có giao dịch không? – user1662812

+0

@ user1662812 Nó hoàn toàn không có gì.Tất cả các câu lệnh đơn đã được bao bọc một cách hiệu quả trong một giao dịch. Tôi không tin rằng điều này tạo ra một giao dịch bên ngoài, gói, mặc dù. –

4

Tôi hiểu rằng điều này là sai vì giao dịch được sử dụng khi bạn muốn cập nhật nhiều bảng.

Không nhất thiết. Điều này bao gồm chỉ có một bảng - và chỉ cần 2 dòng:

--- transaction begin 

BEGIN TRANSACTION ; 

UPDATE tableX 
SET Balance = Balance + 100 
WHERE id = 42 ; 

UPDATE tableX 
SET Balance = Balance - 100 
WHERE id = 73 ; 

COMMIT TRANSACTION ; 

--- transaction end 
3

Hy vọng mã của đồng nghiệp của bạn trông giống như thế này, nếu không SQL sẽ phát hành lỗi cú pháp. Theo nhận xét của Ypercube, không có mục đích thực sự trong việc đặt một câu lệnh bên trong một giao dịch, nhưng có thể đây là một tiêu chuẩn mã hóa hoặc tương tự.

begin transaction -- Increases @@TRANCOUNT to 1 
update table whatever with whatever 
commit transaction -- DECREMENTS @@TRANCOUNT to 0 

Thông thường, khi phát hành báo cáo Adhoc trực tiếp chống lại SQL, nó là một ý tưởng tốt để quấn báo cáo của bạn trong một giao dịch, chỉ trong trường hợp họ gặp khó khăn và bạn cần phải rollback, tức là

begin transaction -- Just in case my query goofs up 
update table whatever with whatever 
select ... from table ... -- check that the correct updates/deletes/inserts happened 
-- commit transaction -- Only commit if the above check succeeds. 
Các vấn đề liên quan