Saya tidak berpikir pertanyaan Anda benar-benar database agnostik. Jawaban yang tepat dapat bergantung pada detail implementasi, yang mungkin berbeda dari vendor ke vendor dan berubah dengan versi berikutnya. Saya akan menguji di bawah konkurensi sebelum memilih pendekatan apa pun pada RDBMS.
Saat ini, di SQL Server 2008 R2, saya menggunakan yang berikut ini:
Konkurensi rendah dan jumlah modifikasi rendah. Untuk menyimpan satu baris, saya membuat serial menggunakan sp_getapplock dan menggunakan MERGE. Saya menekankan pengujian di bawah konkurensi tinggi untuk memverifikasi bahwa itu berfungsi.
Konkurensi dan / atau volume lebih tinggi. Untuk menghindari konkurensi dan meningkatkan kinerja, saya tidak menyimpan satu baris sekaligus. Saya mengakumulasikan perubahan pada server aplikasi saya, dan menggunakan TVP untuk menghemat batch. Namun, untuk menghindari masalah terkait konkurensi, saya membuat serial menggunakan sp_getapplock sebelum MERGE. Sekali lagi, saya menekankan tes di bawah konkurensi tinggi untuk memverifikasi bahwa itu berhasil.
Akibatnya, kami memiliki kinerja yang baik dan nol masalah terkait konkurensi dalam produksi: tidak ada deadlock, tidak ada pelanggaran PK / kendala unik dll.