Menggunakan transaksi dengan kumpulan SQL khusus di Azure Synapse Analytics
Tips untuk menerapkan transaksi dengan kumpulan SQL khusus di Azure Synapse Analytics untuk mengembangkan solusi.
Hal yang diharapkan
Seperti yang Anda harapkan, kumpulan SQL khusus mendukung transaksi sebagai bagian dari beban kerja gudang data. Namun, untuk memastikan performa kumpulan SQL khusus dipertahankan pada skala besar, beberapa fitur akan terbatas jika dibandingkan dengan SQL Server. Artikel ini menyoroti perbedaan dan mencantumkan yang lain.
Tingkat isolasi transaksi
Kumpulan SQL khusus akan menerapkan transaksi ACID. Tingkat isolasi dukungan transaksional diatur menjadi default ke READ UNCOMMITTED. Anda dapat mengubahnya ke READ COMMITTED SNAPSHOT ISOLATION dengan MENGAKTIFKAN opsi database READ_COMMITTED_SNAPSHOT untuk database pengguna saat tersambung ke database master.
Setelah diaktifkan, semua transaksi dalam database ini dijalankan di READ COMMITTED SNAPSHOT ISOLATION dan pengaturan READ UNCOMMITTED pada tingkat sesi tidak akan diterapkan. Centang opsi ALTER DATABASE SET (T-SQL) untuk mengetahui detailnya.
Ukuran transaksi
Satu transaksi modifikasi data berukuran terbatas. Batas diterapkan per distribusi. Dengan demikian, total alokasi dapat dihitung dengan mengalikan batas dengan jumlah distribusi.
Untuk memperkirakan jumlah maksimum baris dalam transaksi, bagi batas distribusi dengan ukuran total setiap baris. Untuk kolom panjang variabel, pertimbangkan untuk membuat ukuran panjang kolom rata-rata daripada menggunakan ukuran maksimum.
Dalam tabel di bawah asumsi berikut telah dibuat:
- Distribusi data yang merata telah diterapkan
- Panjang baris rata-rata adalah 250 byte
Gen2
DWU | Tutup per distribusi (GB) | Jumlah Distribusi | Ukuran transaksi MAX (GB) | # Baris per distribusi | Maks Baris per transaksi |
---|---|---|---|---|---|
DW100c | 1 | 60 | 60 | 4\.000.000 | 240.000.000 |
DW200c | 1.5 | 60 | 90 | 6\.000.000 | 360.000.000 |
DW300c | 2,25 | 60 | 135 | 9\.000.000 | 540.000.000 |
DW400c | 3 | 60 | 180 | 12.000.000 | 720.000.000 |
DW500c | 3,75 | 60 | 225 | 15.000.000 | 900.000.000 |
DW1000c | 7,5 | 60 | 450 | 30.000.000 | 1\.800.000.000 |
DW1500c | 11,25 | 60 | 675 | 45.000.000 | 2\.700.000.000 |
DW2000c | 15 | 60 | 900 | 60.000.000 | 3\.600.000.000 |
DW2500c | 18,75 | 60 | 1125 | 75.000.000 | 4\.500.000.000 |
DW3000c | 22,5 | 60 | 1\.350 | 90.000.000 | 5\.400.000.000 |
DW5000c | 37,5 | 60 | 2,250 | 150.000.000 | 9\.000.000.000 |
DW6000c | 45 | 60 | 2\.700 | 180.000.000 | 10.800.000.000 |
DW7500c | 56,25 | 60 | 3\.375 | 225.000.000 | 13.500.000.000 |
DW10000c | 75 | 60 | 4\.500 | 300.000.000 | 18.000.000.000 |
DW15000c | 112,5 | 60 | 6\.750 | 450.000.000 | 27.000.000.000 |
DW30000c | 225 | 60 | 13.500 | 900.000.000 | 54.000.000.000 |
Gen1
DWU | Tutup per distribusi (GB) | Jumlah Distribusi | Ukuran transaksi MAX (GB) | # Baris per distribusi | Maks Baris per transaksi |
---|---|---|---|---|---|
DW100 | 1 | 60 | 60 | 4\.000.000 | 240.000.000 |
DW200 | 1.5 | 60 | 90 | 6\.000.000 | 360.000.000 |
DW300 | 2,25 | 60 | 135 | 9\.000.000 | 540.000.000 |
DW400 | 3 | 60 | 180 | 12.000.000 | 720.000.000 |
DW500 | 3,75 | 60 | 225 | 15.000.000 | 900.000.000 |
DW600 | 4,5 | 60 | 270 | 18.000.000 | 1\.080.000.000 |
DW1000 | 7,5 | 60 | 450 | 30.000.000 | 1\.800.000.000 |
DW1200 | 9 | 60 | 540 | 36.000.000 | 2\.160.000.000 |
DW1500 | 11,25 | 60 | 675 | 45.000.000 | 2\.700.000.000 |
DW2000 | 15 | 60 | 900 | 60.000.000 | 3\.600.000.000 |
DW3000 | 22,5 | 60 | 1\.350 | 90.000.000 | 5\.400.000.000 |
DW6000 | 45 | 60 | 2\.700 | 180.000.000 | 10.800.000.000 |
Batas ukuran transaksi diterapkan per transaksi atau operasi. Batas tidak diterapkan di semua transaksi bersamaan. Oleh karena itu, setiap transaksi diizinkan untuk menulis jumlah data ini ke log.
Untuk mengoptimalkan dan meminimalkan jumlah data yang tertulis pada log, lihat artikel Praktik terbaik transaksi.
Peringatan
Ukuran transaksi maksimum hanya dapat dicapai untuk tabel terdistribusi HASH atau ROUND_ROBIN dengan penyebaran data merata. Jika transaksi menulis data secara miring ke distribusi, maka batasnya kemungkinan akan tercapai sebelum ukuran transaksi maksimum.
Status transaksi
Kumpulan SQL khusus menggunakan fungsi XACT_STATE() untuk melaporkan transaksi yang gagal menggunakan nilai -2. Nilai ini berarti transaksi telah gagal dan ditandai hanya untuk pembatalan.
Catatan
Penggunaan -2 oleh fungsi XACT_STATE untuk menunjukkan transaksi gagal mewakili perilaku yang berbeda dengan SQL Server. SQL Server menggunakan nilai -1 untuk mewakili transaksi yang tidak dapat dieksekusi. SQL Server dapat mentolerir beberapa kesalahan dalam transaksi tanpa harus ditandai sebagai tidak dapat dieksekusi. Misalnya SELECT 1/0
akan menyebabkan kesalahan tetapi tidak memaksa transaksi ke dalam keadaan yang tidak dapat dieksekusi. SQL Server juga mengizinkan pembacaan dalam transaksi yang tidak dapat dieksekusi. Namun, kumpulan SQL khusus tidak memungkinkan Anda melakukan ini. Jika kesalahan terjadi di dalam transaksi kumpulan SQL khusus, transaksi akan secara otomatis memasuki status -2 dan Anda tidak akan dapat membuat pernyataan select selanjutnya sampai pernyataan telah digulung balik. Oleh karena itu, penting untuk memeriksa kode aplikasi Anda untuk melihat apakah itu menggunakan XACT_STATE() karena Anda mungkin perlu membuat modifikasi kode.
Misalnya, di SQL Server Anda mungkin melihat transaksi yang terlihat seperti berikut:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
Kode sebelumnya memberikan pesan kesalahan berikut:
Msg 111233, Tingkat 16, Negara Bagian 1, Jalur 1 111233; Transaksi saat ini telah dibatalkan, dan setiap perubahan yang tertunda telah digulung balik. Penyebab: Transaksi dalam status hanya putar kembali tidak secara eksplisit digulirkan kembali sebelum pernyataan DDL, DML, atau SELECT.
Anda tidak akan mendapatkan output dari fungsi ERROR_*.
Dalam kumpulan SQL khusus, kode perlu sedikit diubah:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
Perilaku yang diharapkan sekarang diamati. Kesalahan dalam transaksi dikelola dan fungsi ERROR_* memberikan nilai seperti yang diharapkan.
Yang berubah hanyalah bahwa ROLLBACK transaksi harus terjadi sebelum pembacaan informasi kesalahan di blok CATCH.
Fungsi Error_Line()
Perlu juga dicatat bahwa kumpulan SQL khusus tidak mengimplementasikan atau mendukung fungsi ERROR_LINE(). Jika Anda memiliki fungsi ini dalam kode Anda, Anda perlu menghapusnya agar sesuai dengan kumpulan SQL khusus. Gunakan label kueri dalam kode Anda sebagai gantinya untuk menerapkan fungsionalitas yang setara. Untuk mengetahui informasi selengkapnya, lihat artikel LABEL.
Penggunaan THROW dan RAISERROR
THROW adalah implementasi yang lebih modern untuk menerapkan pengecualian di kumpulan SQL khusus tetapi RAISERROR juga didukung. Namun ada beberapa perbedaan yang patut diperhatikan.
- Nomor pesan kesalahan yang ditentukan pengguna tidak boleh berada dalam rentang 100.000 - 150.000 untuk THROW
- Pesan kesalahan RAISERROR diperbaiki pada 50.000
- Penggunaan sys.messages tidak didukung
Batasan
Kumpulan SQL khusus memang memiliki beberapa batasan lain yang berkaitan dengan transaksi. Klaimnya sebagai berikut:
- Tidak ada transaksi terdistribusi
- Tidak ada transaksi berlapis yang diizinkan
- Tidak ada titik simpan yang diizinkan
- Tidak ada transaksi bernama
- Tidak ada transaksi yang ditandai
- Tidak ada dukungan untuk DDL seperti CREATE TABLE di dalam transaksi yang ditentukan pengguna
Langkah berikutnya
Untuk mempelajari lebih lanjut cara mengoptimalkan transaksi, lihat Praktik terbaik transaksi. Panduan praktik terbaik tambahan juga tersedia untuk kumpulan SQL Khusus dan kumpulan SQL tanpa server.