Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server - Sisipan Bersamaan ke tabel dari beberapa klien - Periksa Batas dan Blok

Saya rasa tidak mungkin melakukan ini secara deklaratif.

Jika semua sisipan dijamin melalui prosedur tersimpan dan SaleValue tidak diperbarui setelah dimasukkan, maka yang berikut ini akan berfungsi (saya membuat nama tabel dan kolom karena ini tidak disediakan dalam pertanyaan awal)

DECLARE @SumSaleValue MONEY

BEGIN TRAN

SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId

IF @SumSaleValue > 1000
    BEGIN
    RAISERROR('Cannot do insert as total would exceed order limit',16,1);
    ROLLBACK;
    RETURN;
    END

/*Code for INSERT goes here*/

COMMIT

HOLDLOCK memberikan semantik serial dan mengunci seluruh rentang yang cocok dengan TransactionId dan UPDLOCK mencegah dua transaksi bersamaan mengunci rentang yang sama sehingga mengurangi risiko kebuntuan.

Indeks di TransactionId,SaleValue sebaiknya mendukung kueri ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Solusi untuk DATEDIFF() Mengabaikan SET DATEFIRST di SQL Server (Contoh T-SQL)

  2. Cara Memulihkan Database SQL Server di Mac menggunakan Azure Data Studio

  3. Cara mendapatkan semua log transaksi (masukkan penghapusan pembaruan) untuk tabel tertentu di SQL Server 2008

  4. Bagaimana cara menambahkan string dengan nilai kenaikan otomatis di SQL Server?

  5. Bergabunglah dengan dua tabel, hanya gunakan nilai terbaru dari tabel kanan