Tingkat Isolasi Transaksi di Babelfish - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Tingkat Isolasi Transaksi di Babelfish

Babelfish mendukung Tingkat Isolasi Transaksi READ UNCOMMITTED, READ COMMITTED dan SNAPSHOT. Mulai dari versi Babelfish 3.4 Tingkat Isolasi tambahan REPEATABLE READING dan SERIALIZABLE didukung. Semua Tingkat Isolasi di Babelfish didukung dengan perilaku Tingkat Isolasi yang sesuai di PostgreSQL. SQL Server dan Babelfish menggunakan mekanisme dasar yang berbeda untuk menerapkan Tingkat Isolasi Transaksi (memblokir untuk akses bersamaan, kunci yang dipegang oleh transaksi, penanganan kesalahan, dll). Dan, ada beberapa perbedaan halus dalam cara akses bersamaan dapat bekerja untuk beban kerja yang berbeda. Untuk informasi selengkapnya tentang perilaku PostgreSQL ini, lihat Isolasi Transaksi.

Ikhtisar Tingkat Isolasi Transaksi

Tingkat Isolasi Transaksi SQL Server asli didasarkan pada penguncian pesimis di mana hanya satu salinan data yang ada dan kueri harus mengunci sumber daya seperti baris sebelum mengaksesnya. Kemudian, variasi Tingkat Isolasi Berkomitmen Baca diperkenalkan. Ini memungkinkan penggunaan versi baris untuk memberikan konkurensi yang lebih baik antara pembaca dan penulis menggunakan akses non-pemblokiran. Selain itu, Level Isolasi baru yang disebut Snapshot tersedia. Ini juga menggunakan versi baris untuk memberikan konkurensi yang lebih baik daripada Tingkat Isolasi BACA YANG DAPAT DIULANG dengan menghindari kunci bersama pada data baca yang disimpan hingga akhir transaksi.

Tidak seperti SQL Server, semua Tingkat Isolasi Transaksi di Babelfish didasarkan pada Optimistic Locking (MVCC). Setiap transaksi melihat snapshot data baik di awal pernyataan (READ COMMITTED) atau di awal transaksi (REPEATABLE READ, SERIALIZABLE), terlepas dari keadaan saat ini dari data yang mendasarinya. Oleh karena itu, perilaku eksekusi transaksi bersamaan di Babelfish mungkin berbeda dari SQL Server.

Misalnya, pertimbangkan transaksi dengan Isolation Level SERIALIZABLE yang awalnya diblokir di SQL Server tetapi berhasil nanti. Ini mungkin berakhir gagal di Babelfish karena konflik serialisasi dengan transaksi bersamaan yang membaca atau memperbarui baris yang sama. Mungkin juga ada kasus di mana mengeksekusi beberapa transaksi bersamaan menghasilkan hasil akhir yang berbeda di Babelfish dibandingkan dengan SQL Server. Aplikasi yang menggunakan Tingkat Isolasi, harus diuji secara menyeluruh untuk skenario konkurensi.

Tingkat Isolasi di SQL Server Tingkat Isolasi Babelfish Tingkat Isolasi PostgreSQL Komentar

BACA UNCOMMIT

BACA UNCOMMIT

BACA UNCOMMIT

Read Uncommitted sama dengan Read Comited di BabelFish/PostgreSQL

BACA BERKOMITMEN

BACA BERKOMITMEN

BACA BERKOMITMEN

SQL Server Read Comited berbasis penguncian pesimis, Babelfish Read Committed berbasis snapshot (MVCC).

BACA SNAPSHOT YANG BERKOMITMEN

BACA BERKOMITMEN

BACA BERKOMITMEN

Keduanya berbasis snapshot (MVCC) tetapi tidak persis sama.

REKAM JEPRET

REKAM JEPRET

DIBACA BERULANG

Persis sama.

DIBACA BERULANG

DIBACA BERULANG

DIBACA BERULANG

SQL Server Repeatable Read berbasis penguncian pesimis, Babelfish Repeatable Read berbasis snapshot (MVCC).

DAPAT DISERIALKAN

DAPAT DISERIALKAN

DAPAT DISERIALKAN

SQL Server Serializable adalah isolasi pesimis, Babelfish Serializable berbasis snapshot (MVCC).

catatan

Petunjuk tabel saat ini tidak didukung dan perilakunya dikendalikan dengan menggunakan palka pelarian Babelfish yang telah ditentukan sebelumnya. escape_hatch_table_hints

Menyiapkan Tingkat Isolasi Transaksi

Gunakan perintah berikut untuk mengatur Tingkat Isolasi Transaksi:

SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }

Mengaktifkan atau menonaktifkan Tingkat Isolasi Transaksi

Tingkat Isolasi Transaksi REPEATABLE READ dan SERIALIZABLE dinonaktifkan secara default di Babelfish dan Anda harus mengaktifkannya secara eksplisit dengan menyetel atau escape hatch untuk digunakan. babelfishpg_tsql.isolation_level_serializable babelfishpg_tsql.isolation_level_repeatable_read pg_isolation sp_babelfish_configure Untuk informasi selengkapnya, lihat Mengelola penanganan kesalahan Babelfish dengan escape hatch.

Di bawah ini adalah contoh untuk mengaktifkan atau menonaktifkan penggunaan REPEATABLE READ dan SERIALIZABLE di sesi saat ini dengan mengatur lubang keluar masing-masing. Secara opsional sertakan server parameter untuk mengatur escape hatch untuk sesi saat ini serta untuk semua sesi baru berikutnya.

Untuk mengaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL REPEATABLE REPEATABLE READ hanya pada sesi saat ini.

EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'

Untuk mengaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL REPEATABLE REPEATABLE READING di sesi saat ini dan semua sesi baru yang diakibatkannya.

EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'

Untuk menonaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL REPEATABLE REPEATABLE REPEATABLE READ di sesi saat ini dan sesi baru konsekuen.

EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'

Untuk mengaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL SERIALIZABLE pada sesi saat ini saja.

EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'

Untuk mengaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL SERIALIZABLE di sesi saat ini dan semua sesi baru yang diakibatkannya.

EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'

Untuk menonaktifkan penggunaan SET TRANSACTION ISOLATION LEVEL SERIALIZABLE di sesi saat ini dan selanjutnya sesi baru.

EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'

Perbedaan Antara Tingkat Isolasi Babelfish dan SQL Server

Di bawah ini adalah beberapa contoh tentang nuansa bagaimana SQL Server dan Babelfish mengimplementasikan ANSI Isolation Levels.

catatan
  • Tingkat Isolasi Repeatable Read dan Snapshot sama di Babelfish.

  • Tingkat Isolasi Baca Tidak Berkomitmen dan Baca Berkomitmen sama di Babelfish.

Contoh berikut menunjukkan cara membuat tabel dasar untuk semua contoh yang disebutkan di bawah ini:

CREATE TABLE employee ( id sys.INT NOT NULL PRIMARY KEY, name sys.VARCHAR(255)NOT NULL, age sys.INT NOT NULL ); INSERT INTO employee (id, name, age) VALUES (1, 'A', 10); INSERT INTO employee (id, name, age) VALUES (2, 'B', 20); INSERT INTO employee (id, name, age) VALUES (3, 'C', 30);

BABELFISH MEMBACA UNCOMMITTED VS SQL SERVER MEMBACA TINGKAT ISOLASI TANPA KOMITMEN

BACAAN KOTOR DI SERVER SQL
Transaksi 1 Transaksi 2 SQL Server Baca Tidak Berkomitmen Babelfish Baca Tanpa Komitmen

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA TANPA KOMITMEN;

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA TANPA KOMITMEN;

UPDATE karyawan SET age = 0;

Pembaruan berhasil.

Pembaruan berhasil.

MASUKKAN KE DALAM NILAI KARYAWAN (4, 'D', 40);

Masukkan berhasil.

Masukkan berhasil.

PILIH * DARI KARYAWAN;

Transaksi 1 dapat melihat perubahan tanpa komitmen dari Transaksi 2.

Sama seperti Read Comited di Babelfish. Perubahan yang tidak dilakukan dari Transaksi 2 tidak terlihat oleh Transaksi 1.

COMMIT

PILIH * DARI KARYAWAN;

Melihat perubahan yang dilakukan oleh Transaksi 2.

Melihat perubahan yang dilakukan oleh Transaksi 2.

BABELFISH READ COMMIT VS SQL SERVER MEMBACA TINGKAT ISOLASI YANG BERKOMITMEN

BACA - TULIS PEMBLOKIRAN
Transaksi 1 Transaksi 2 SQL Server Baca Berkomitmen Babelfish Baca Berkomitmen

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA KOMITMEN;

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA KOMITMEN;

PILIH * DARI KARYAWAN;

UPDATE karyawan SET age = 100 WHERE id = 1;

Pembaruan berhasil.

Pembaruan berhasil.

UPDATE karyawan SET usia = 0 DIMANA usia DI (PILIH MAX (usia) DARI karyawan);

Langkah diblokir hingga Transaksi 2 dilakukan.

Transaksi 2 perubahan belum terlihat. Update baris dengan id = 3.

COMMIT

Transaksi 2 berhasil dilakukan. Transaksi 1 sekarang tidak diblokir dan melihat pembaruan dari Transaksi 2.

Transaksi 2 berhasil dilakukan.

PILIH * DARI KARYAWAN;

Transaksi 1 memperbarui baris dengan id = 1.

Transaksi 1 memperbarui baris dengan id = 3.

BABELFISH READ COMMIT VS SQL SERVER MEMBACA TINGKAT ISOLASI SNAPSHOT YANG BERKOMITMEN

MEMBLOKIR PERILAKU PADA BARIS BARU YANG DISISIPKAN
Transaksi 1 Transaksi 2 SQL Server Membaca Snapshot Berkomitmen Babelfish Baca Berkomitmen

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA KOMITMEN;

MENGATUR TINGKAT ISOLASI TRANSAKSI BACA KOMITMEN;

MASUKKAN KE DALAM NILAI KARYAWAN (4, 'D', 40);

UPDATE karyawan SET usia = 99;

Langkah diblokir sampai transaksi 1 dilakukan. Baris yang dimasukkan dikunci oleh transaksi 1.

Diperbarui tiga baris. Baris yang baru dimasukkan belum terlihat.

COMMIT

Berkomitmen sukses. Transaksi 2 sekarang tidak diblokir.

Berkomitmen sukses.

PILIH * DARI KARYAWAN;

Semua 4 baris memiliki usia = 99.

Baris dengan id = 4 memiliki nilai usia 40 karena tidak terlihat oleh transaksi 2 selama kueri pembaruan. Baris lainnya diperbarui ke age=99.

BABELFISH REPEABLE READ VS SQL SERVER TINGKAT ISOLASI BACA BERULANG

MEMBACA/MENULIS PERILAKU PEMBLOKIRAN
Transaksi 1 Transaksi 2 SQL Server yang Dapat Dibaca Berulang Babelfish yang Dapat Dibaca Berulang

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

PILIH * DARI KARYAWAN;

UPDATE karyawan SET NAME='A_TXN1' WHERE id = 1;

PILIH * DARI karyawan WHERE id! = 1;

PILIH * DARI KARYAWAN;

Transaksi 2 diblokir sampai Transaksi 1 dilakukan.

Transaksi 2 berlangsung secara normal.

COMMIT

PILIH * DARI KARYAWAN;

Pembaruan dari Transaksi 1 terlihat.

Pembaruan dari Transaksi 1 tidak terlihat.

COMMIT

PILIH * DARI KARYAWAN;

melihat pembaruan dari Transaksi 1.

melihat pembaruan dari Transaksi 1.

MENULIS/MENULIS PERILAKU PEMBLOKIRAN
Transaksi 1 Transaksi 2 SQL Server yang Dapat Dibaca Berulang Babelfish yang Dapat Dibaca Berulang

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

UPDATE karyawan SET NAME='A_TXN1' WHERE id = 1;

UPDATE karyawan SET NAME='A_TXN2' WHERE id = 1;

Transaksi 2 diblokir.

Transaksi 2 diblokir.

COMMIT

Komit berhasil dan transaksi 2 telah diblokir.

Komit berhasil dan transaksi 2 gagal dengan kesalahan tidak dapat membuat serial akses karena pembaruan bersamaan.

COMMIT

Berkomitmen sukses.

Transaksi 2 telah dibatalkan.

PILIH * DARI KARYAWAN;

Baris dengan id=1 memiliki name='A_TX2'.

Baris dengan id=1 memiliki name='A_TX1'.

HANTU MEMBACA
Transaksi 1 Transaksi 2 SQL Server yang Dapat Dibaca Berulang Babelfish yang Dapat Dibaca Berulang

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

PILIH * DARI KARYAWAN;

MASUKKAN KE DALAM NILAI KARYAWAN (4, NewRowName '', 20);

Transaksi 2 berlangsung tanpa pemblokiran apa pun.

Transaksi 2 berlangsung tanpa pemblokiran apa pun.

PILIH * DARI KARYAWAN;

Baris yang baru dimasukkan terlihat.

Baris yang baru dimasukkan terlihat.

COMMIT

PILIH * DARI KARYAWAN;

Baris baru yang dimasukkan oleh transaksi 2 terlihat.

Baris baru yang dimasukkan oleh transaksi 2 tidak terlihat.

COMMIT

PILIH * DARI KARYAWAN;

Baris yang baru dimasukkan terlihat.

Baris yang baru dimasukkan terlihat.

HASIL AKHIR YANG BERBEDA
Transaksi 1 Transaksi 2 SQL Server yang Dapat Dibaca Berulang Babelfish yang Dapat Dibaca Berulang

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

UPDATE karyawan SET usia = 100 WHERE age IN (PILIH MIN (usia) DARI karyawan);

Transaksi 1 memperbarui baris dengan id 1.

Transaksi 1 memperbarui baris dengan id 1.

UPDATE karyawan SET usia = 0 DIMANA usia DI (PILIH MAX (usia) DARI karyawan);

Transaksi 2 diblokir karena pernyataan SELECT mencoba membaca baris yang dikunci oleh kueri UPDATE dalam transaksi 1.

Transaksi 2 berlangsung tanpa pemblokiran karena baca tidak pernah diblokir, pernyataan SELECT dijalankan dan akhirnya baris dengan id = 3 diperbarui karena perubahan transaksi 1 belum terlihat.

PILIH * DARI KARYAWAN;

Langkah ini dilakukan setelah transaksi 1 dilakukan. Baris dengan id = 1 diperbarui oleh transaksi 2 pada langkah sebelumnya dan terlihat di sini.

Baris dengan id = 3 diperbarui oleh Transaksi 2.

COMMIT

Transaksi 2 sekarang tidak diblokir.

Berkomitmen sukses.

COMMIT

PILIH * DARI KARYAWAN;

Kedua transaksi mengeksekusi pembaruan pada baris dengan id = 1.

Baris yang berbeda diperbarui dengan transaksi 1 dan 2.

BABELFISH SERIALIZABLE VS SQL SERVER TINGKAT ISOLASI SERIALIZABLE

KUNCI RENTANG DI SERVER SQL
Transaksi 1 Transaksi 2 SQL Server Serial Babelfish Serializable

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

PILIH * DARI KARYAWAN;

MASUKKAN KE DALAM NILAI KARYAWAN (4, 'D', 35);

Transaksi 2 diblokir sampai Transaksi 1 dilakukan.

Transaksi 2 berlangsung tanpa pemblokiran apa pun.

PILIH * DARI KARYAWAN;

COMMIT

Transaksi 1 berhasil dilakukan. Transaksi 2 sekarang tidak diblokir.

Transaksi 1 berhasil dilakukan.

COMMIT

PILIH * DARI KARYAWAN;

Baris yang baru dimasukkan terlihat.

Baris yang baru dimasukkan terlihat.

HASIL AKHIR YANG BERBEDA
Transaksi 1 Transaksi 2 SQL Server Serial Babelfish Serializable

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MASUKKAN KE DALAM NILAI KARYAWAN (4, 'D', 40);

UPDATE karyawan SET usia = 99 WHERE id = 4;

Transaksi 1 diblokir hingga Transaksi 2 dilakukan.

Transaksi 1 berlangsung tanpa pemblokiran apa pun.

COMMIT

Transaksi 2 berhasil dilakukan. Transaksi 1 sekarang tidak diblokir.

Transaksi 2 berhasil dilakukan.

COMMIT

PILIH * DARI KARYAWAN;

Baris yang baru dimasukkan terlihat dengan nilai usia = 99.

Baris yang baru dimasukkan terlihat dengan nilai usia = 40.

MASUKKAN KE DALAM TABEL DENGAN KENDALA UNIK
Transaksi 1 Transaksi 2 SQL Server Serial Babelfish Serializable

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MASUKKAN KE DALAM NILAI KARYAWAN (4, 'D', 40);

MASUKKAN KE DALAM NILAI karyawan ((PILIH MAX (id) +1 DARI karyawan), 'E', 50);

Transaksi 1 diblokir hingga Transaksi 2 dilakukan.

Transaksi 1 diblokir hingga Transaksi 2 dilakukan.

COMMIT

Transaksi 2 berhasil dilakukan. Transaksi 1 sekarang tidak diblokir.

Transaksi 2 berhasil dilakukan. Transaksi 1 dibatalkan dengan kesalahan nilai kunci duplikat melanggar batasan unik.

COMMIT

Transaksi 1 berhasil dilakukan.

Transaksi 1 komit gagal dengan tidak dapat membuat serial akses karena ketergantungan baca/tulis di antara transaksi.

PILIH * DARI KARYAWAN;

baris (5, 'E', 50) dimasukkan.

Hanya ada 4 baris.

Di Babelfish, transaksi bersamaan yang berjalan dengan Isolation Level serializable akan gagal dengan kesalahan anomali serialisasi jika eksekusi transaksi ini tidak konsisten dengan semua kemungkinan eksekusi serial (satu per satu) dari transaksi tersebut.

ANOMALI SERIALISASI
Transaksi 1 Transaksi 2 SQL Server Serial Babelfish Serializable

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

PILIH * DARI KARYAWAN;

UPDATE karyawan SET age = 5 WHERE age = 10;

PILIH * DARI KARYAWAN;

Transaksi 2 diblokir sampai Transaksi 1 dilakukan.

Transaksi 2 berlangsung tanpa pemblokiran apa pun.

UPDATE karyawan SET age = 35 WHERE age = 30;

COMMIT

Transaksi 1 berhasil dilakukan.

Transaksi 1 dilakukan terlebih dahulu dan mampu melakukan komit dengan sukses.

COMMIT

Transaksi 2 berhasil dilakukan.

Komit transaksi 2 gagal dengan kesalahan serialisasi, seluruh transaksi telah dibatalkan. Coba lagi transaksi 2.

PILIH * DARI KARYAWAN;

Perubahan dari kedua transaksi terlihat.

Transaksi 2 digulirkan kembali. Hanya transaksi 1 perubahan yang terlihat.

Di Babelfish, anomali serialisasi hanya mungkin jika semua transaksi bersamaan dijalankan di Isolation Level SERIALIZABLE. Misalnya mari kita ambil contoh di atas tetapi atur transaksi 2 ke Tingkat Isolasi REPEATABLE READING sebagai gantinya.

Transaksi 1 Transaksi 2 Tingkat Isolasi SQL Server Tingkat Isolasi Babelfish

MULAI TRANSAKSI

MULAI TRANSAKSI

MENGATUR TINGKAT ISOLASI TRANSAKSI SERILAIZABLE;

MENGATUR TINGKAT ISOLASI TRANSAKSI YANG DAPAT DIBACA BERULANG;

PILIH * DARI KARYAWAN;

UPDATE karyawan SET age = 5 WHERE age = 10;

PILIH * DARI KARYAWAN;

Transaksi 2 diblokir sampai transaksi 1 dilakukan.

Transaksi 2 berlangsung tanpa pemblokiran apa pun.

UPDATE karyawan SET age = 35 WHERE age = 30;

COMMIT

Transaksi 1 berhasil dilakukan.

Transaksi 1 berhasil dilakukan.

COMMIT

Transaksi 2 berhasil dilakukan.

Transaksi 2 berhasil dilakukan.

PILIH * DARI KARYAWAN;

Perubahan dari kedua transaksi terlihat.

Perubahan dari kedua transaksi terlihat.