Kursor yang Dikendalikan Keyset

Kursor berbasis keyset terletak di antara kursor statis dan dinamis dalam kemampuannya untuk mendeteksi perubahan. Seperti kursor statis, kursor tidak selalu mendeteksi perubahan pada keanggotaan dan urutan kumpulan hasil. Seperti kursor dinamis, ini mendeteksi perubahan pada nilai baris dalam tataan hasil (tunduk pada tingkat isolasi transaksi, seperti yang ditetapkan oleh atribut koneksi SQL_ATTR_TXN_ISOLATION).

Saat kursor berbasis keyset dibuka, kursor menyimpan kunci untuk seluruh tataan hasil; ini memperbaiki keanggotaan dan urutan tataan hasil yang jelas. Saat kursor menggulir melalui kumpulan hasil, kursor menggunakan kunci dalam set kunci ini untuk mengambil nilai data saat ini untuk setiap baris. Misalnya, kursor berbasis keyset mengambil baris dan aplikasi lain kemudian memperbarui baris tersebut. Jika kursor mengambil ulang baris, nilai yang dilihatnya adalah yang baru karena mengambil ulang baris menggunakan kuncinya. Karena itu, kursor yang digerakkan oleh keyset selalu mendeteksi perubahan yang dibuat oleh diri mereka sendiri dan orang lain.

Ketika kursor mencoba mengambil baris yang telah dihapus, baris ini muncul sebagai "lubang" dalam tataan hasil: Kunci untuk baris ada di set kunci, tetapi baris tidak ada lagi dalam tataan hasil. Jika nilai kunci dalam baris diperbarui, baris dianggap telah dihapus lalu disisipkan, sehingga baris tersebut juga muncul sebagai lubang dalam tataan hasil. Meskipun kursor berbasis keyset selalu dapat mendeteksi baris yang dihapus oleh orang lain, kursor dapat secara opsional menghapus kunci untuk baris yang dihapusnya sendiri dari set kunci. Kursor berbasis set kunci yang melakukan ini tidak dapat mendeteksi penghapusannya sendiri. Apakah kursor berbasis keyset tertentu mendeteksi penghapusannya sendiri dilaporkan melalui opsi SQL_STATIC_SENSITIVITY di SQLGetInfo.

Baris yang disisipkan oleh orang lain tidak pernah terlihat oleh kursor berbasis keyset karena tidak ada kunci untuk baris ini di set kunci. Namun, kursor berbasis keyset dapat secara opsional menambahkan kunci untuk baris yang disisipkannya ke set kunci. Kursor berbasis set kunci yang melakukan ini dapat mendeteksi sisipannya sendiri. Apakah kursor berbasis keyset tertentu mendeteksi sisipannya sendiri dilaporkan melalui opsi SQL_STATIC_SENSITIVITY di SQLGetInfo.

Array status baris yang ditentukan oleh atribut pernyataan SQL_ATTR_ROW_STATUS_PTR dapat berisi SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO, atau SQL_ROW_ERROR untuk baris apa pun. Ini mengembalikan SQL_ROW_UPDATED, SQL_ROW_DELETED, atau SQL_ROW_ADDED untuk baris yang dideteksinya sebagai diperbarui, dihapus, atau disisipkan.

Kursor berbasis set kunci umumnya diimplementasikan dengan membuat tabel sementara yang berisi kunci untuk setiap baris dalam tataan hasil. Karena kursor juga harus menentukan apakah baris telah diperbarui, tabel ini juga biasanya berisi kolom dengan informasi penerapan versi baris.

Untuk menggulir set hasil asli, kursor berbasis keyset membuka kursor statis di atas tabel sementara. Untuk mengambil baris dalam tataan hasil asli, kursor terlebih dahulu mengambil kunci yang sesuai dari tabel sementara lalu mengambil nilai saat ini untuk baris tersebut. Jika kursor blok digunakan, kursor harus mengambil beberapa kunci dan baris.