Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

TSQL truy cập độc quyền lẫn nhau trong một thủ tục được lưu trữ

SERIALIZABLE là mức cách ly để khóa, không phải là semaphore .

Nó sẽ không hoạt động trong trường hợp này, tất cả những gì bạn sẽ làm là duy trì một khóa đọc ở cuối TXN mà không ngăn quá trình khác đọc mã.

Bạn cần sử dụng sp_getapplock trong chế độ Giao dịch. Bạn có thể cấu hình nó để đợi, đặt bom ngay lập tức, v.v.:tùy thuộc vào bạn

Điều này dựa trên mẫu của tôi từ Các thủ tục được lưu trữ lồng nhau có chứa mẫu TRY CATCH ROLLBACK?

ALTER PROCEDURE get_code 
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int, @result int;

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0 BEGIN TRANSACTION

    EXEC @result = sp_getapplock 'get_code', 'Exclusive', 'Transaction', 0 
    IF @result < 0
        RAISERROR('INFO: One at a time please`!', 16, 1);

    [...Perform work...]


    IF @starttrancount = 0 
        COMMIT TRANSACTION
    ELSE
        EXEC sp_releaseapplock 'get_code';
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xem nhiều truy vấn và kết quả song song trong SQL Server Management Studio (SSMS) - Hướng dẫn sử dụng SQL Server / TSQL Phần 14

  2. Kiểu văn bản SQL Server so với kiểu dữ liệu varchar

  3. Visual Studio 2012 - Trình hướng dẫn xuất bản cơ sở dữ liệu ngừng hoạt động?

  4. Băm nhỏ XML từ các kế hoạch thực thi

  5. Đi với trình điều khiển SQL Server không thể kết nối thành công, đăng nhập không thành công