Fungsi JetEscrowUpdate
Berlaku untuk: Windows | Windows Server
Fungsi JetEscrowUpdate
Fungsi JetEscrowUpdate melakukan operasi penambahan atomik pada satu kolom. Fungsi ini memungkinkan beberapa sesi untuk memperbarui rekaman yang sama secara bersamaan tanpa konflik.
JET_ERR JET_API JetEscrowUpdate(
__in JET_SESID sesid,
__in JET_TABLEID tableid,
__in JET_COLUMNID columnid,
__in void* pv,
__in unsigned long cbMax,
__out_opt void* pvOld,
__in unsigned long cbOldMax,
__out_opt unsigned long* pcbOldActual,
__in JET_GRBIT grbit
);
Parameter
sesid
Sesi yang digunakan untuk panggilan ini.
tableid
Kursor yang digunakan untuk panggilan ini.
columnid
Columnid kolom yang akan diperbarui.
Pv
Penunjuk ke buffer yang berisi addend untuk kolom.
cbMax
Ukuran buffer yang berisi addend.
pvOld
Buffer output yang akan menerima nilai kolom saat ini seperti yang disimpan dalam database (penerapan versi diabaikan).
cbOldMax
Ukuran maksimum buffer output yang akan menerima nilai kolom saat ini. Saat ini hanya JET_coltypLong yang didukung, sehingga panjang buffer harus 4 byte atau 0 byte. Jika pvOld ADALAH NULL, maka cbOldMax harus 0.
pcbOldActual
Menerima jumlah aktual data nilai mentah yang diterima dalam buffer output.
grbit
Sekelompok bit yang menentukan nol atau beberapa opsi berikut.
Nilai |
Makna |
---|---|
JET_bitEscrowNoRollback |
Bahkan jika sesi yang melakukan pembaruan escrow memiliki pembatalan transaksi, pembaruan ini tidak akan dibatalkan. Perhatikan bahwa karena catatan log mungkin tidak dihapus ke disk, pembaruan escrow terbaru yang dilakukan dengan bendera ini mungkin hilang jika ada crash. |
Tampilkan Nilai
Fungsi ini mengembalikan jenis data JET_ERR dengan salah satu kode pengembalian berikut. Untuk informasi selengkapnya tentang kemungkinan kesalahan ESE, lihat Kesalahan Mesin Penyimpanan yang Dapat Diperluas dan Parameter Penanganan Kesalahan.
Menampilkan kode |
Deskripsi |
---|---|
JET_errSuccess |
Operasi berhasil diselesaikan. |
JET_errAlreadyPrepared |
Kursor memiliki pembaruan yang disiapkan dengan JetPrepareUpdate. |
JET_errClientRequestToStopJetService |
Tidak dimungkinkan untuk menyelesaikan operasi karena semua aktivitas pada instans yang terkait dengan sesi telah berhenti sebagai akibat dari panggilan ke JetStopService. |
JET_errInstanceUnavailable |
Tidak dimungkinkan untuk menyelesaikan operasi karena instans yang terkait dengan sesi telah mengalami kesalahan fatal yang mengharuskan akses ke semua data dicabut untuk melindungi integritas data tersebut. Kesalahan ini hanya akan dikembalikan oleh Windows XP dan rilis yang lebih baru. |
JET_errInvalidBufferSize |
Ukuran buffer yang tidak valid telah diteruskan. Saat ini hanya JET_coltypLong yang didukung, sehingga buffer harus 4 byte. |
JET_errInvalidOperation |
Kolom yang tidak valid telah ditentukan. Kolom harus dibuat dengan JET_bitColumnEscrowUpdate ditentukan. Hanya kolom tetap JET_coltypLong yang dapat ditentukan sebagai escrow yang dapat diperbarui. |
JET_errNoCurrentRecord |
Kursor harus berada di rekaman untuk memperbarui kolom. |
JET_errNotInTransaction |
Pembaruan Escrow hanya dapat dilakukan oleh sesi dalam transaksi. |
JET_errNotInitialized |
Tidak dimungkinkan untuk menyelesaikan operasi karena instans yang terkait dengan sesi belum diinisialisasi. |
JET_errPermissionDenied |
Kursor tidak dapat dibaca saja dan memperbarui rekaman. |
JET_errRestoreInProgress |
Tidak dimungkinkan untuk menyelesaikan operasi karena operasi pemulihan sedang berlangsung pada instans yang terkait dengan sesi. |
JET_errSessionSharingViolation |
Sesi yang sama tidak dapat digunakan dari lebih dari satu utas secara bersamaan. Kesalahan ini hanya akan dikembalikan oleh Windows XP dan rilis yang lebih baru. |
JET_errTermInProgress |
Tidak dimungkinkan untuk menyelesaikan operasi karena instans yang terkait dengan sesi sedang dimatikan. |
JET_errTransReadOnly |
Sesi harus memiliki izin tulis untuk memperbarui rekaman. |
JET_errWriteConflict |
Kesalahan ditampilkan ketika pembaruan yang bertentangan diminta. |
Keterangan
Biasanya, jika dua sesi mencoba memperbarui rekaman secara bersamaan, sesi kedua akan menerima kesalahan JET_errWriteConflict kecuali sesi benar-benar diserialisasikan. Untuk membuat serial dua sesi yang memperbarui catatan yang sama, sesi kedua harus memulai transaksinya setelah transaksi pertama melakukan transaksinya. Lihat JetBeginTransaction untuk informasi selengkapnya.
Beberapa kolom dalam rekaman yang sama dapat diperbarui escrow. Pembaruan tidak mempengaruhi satu sama lain.
Hanya operasi JetEscrowUpdate yang kompatibel satu sama lain. Jika dua sesi berbeda mencoba menyiapkan pembaruan atau menghapus rekaman yang sama, konflik tulis akan dihasilkan.
Sesi B |
||||
---|---|---|---|---|
JetEscrowUpdate |
JET_errSuccess |
JET_errWriteConflict |
JET_errWriteConflict |
|
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
||
Sesi A |
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
Operasi Escrow diberi versi dan dibatalkan menggunakan JetRollback (kecuali JET_bitEscrowNoRollback ditentukan). JetEscrowUpdate mengembalikan nilai mentah kolom yang disimpan dalam database, karena aplikasi mungkin ingin melakukan tindakan khusus saat nilai sentinel tercapai. JetRetrieveColumn mengembalikan tampilan kolom dengan versi yang benar, mengabaikan pembaruan yang dibuat oleh sesi bersamaan.
Mengingat dua sesi yang beroperasi pada kolom yang sama dari rekaman yang sama, kita dapat melihat cara kerjanya. Asumsikan kolom dimulai dengan nilai 0.
Sesi |
Operasi |
Nilai tersimpan |
Nilai yang dikembalikan |
---|---|---|---|
A |
|||
A |
0 |
||
A |
JetEscrowUpdate (4) |
4 |
0 |
A |
4 |
||
B |
|||
B |
0 |
||
B |
JetEscrowUpdate (3) |
7 |
4 |
B |
3 |
||
A |
JetEscrowUpdate (2) |
9 |
7 |
A |
JetEscrowUpdate (-7) |
2 |
9 |
B |
3 |
||
A |
-1 |
||
B |
-1 |
||
A |
-1 |
Mengganti rekaman dalam transaksi yang sama yang melakukan pembaruan escrow ke rekaman tidak disarankan. Secara khusus, jika pembaruan pada catatan disiapkan dengan satu JET_TABLEID dan JET_TABLEID yang berbeda digunakan untuk memperbarui catatan, maka escrow yang diperbarui akan hilang ketika JetUpdate dipanggil. Ini terjadi bahkan jika kolom escrow tidak diatur selama pembaruan.
Ketika kolom yang dapat diperbarui escrow memiliki nilai nol, perilaku khusus dapat dipicu. Perilaku ini hanya terjadi jika operasi JetEscrowUpdate menyebabkan kolom memiliki nilai nol. Tindakan tidak segera terjadi, tetapi terjadi beberapa saat setelah transaksi yang menyebabkan kolom memiliki nilai nol penerapan. Kolom harus masih memiliki nilai nol (yaitu, jika tidak ada sesi lain yang telah memodifikasi kolom). Jika kolom dibuat dengan JET_bitColumnDeleteOnZero, rekaman yang berisi kolom akan dihapus. Jika kolom dibuat dengan JET_bitColumnFinalize maka panggilan balik akan dikeluarkan. Crash dapat menyebabkan tindakan ini tidak terjadi, tetapi pemeliharaan online (menggunakan fungsi JetDefragment ) akan mengulangi tindakan dengan benar.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien |
Memerlukan Windows Vista, Windows XP, atau Windows 2000 Professional. |
Server |
Memerlukan Windows Server 2008, Windows Server 2003, atau Windows 2000 Server. |
Header |
Dinyatakan dalam Esent.h. |
Pustaka |
Gunakan ESENT.lib. |
DLL |
Membutuhkan ESENT.dll. |
Lihat juga
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragment
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate