Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Amazon DynamoDB Transactions: Cara kerjanya
Dengan transaksi Amazon DynamoDB, Anda dapat mengelompokkan beberapa tindakan bersama-sama dan mengirimkannya sebagai satu atau all-or-nothing TransactWriteItems
operasi. TransactGetItems
Bagian berikut menjelaskan operasi API, manajemen kapasitas, praktik terbaik, dan detail lainnya tentang menggunakan operasi transaksional di DynamoDB.
Topik
- TransactWriteItems API
- TransactGetItems API
- Tingkat isolasi untuk DynamoDB transactions
- Penanganan konflik transaksi di DynamoDB
- Menggunakan API Transaksional di DynamoDB Accelerator (DAX)
- Manajemen kapasitas untuk transaksi
- Praktik terbaik untuk transactions
- Menggunakan API transaksional dengan tabel global
- Transaksi DynamoDB AWSLabs vs. perpustakaan klien transaksi
TransactWriteItems API
TransactWriteItems
adalah operasi penulisan sinkron dan idempoten yang mengelompokkan hingga 100 tindakan penulisan dalam satu operasi. all-or-nothing Tindakan ini dapat menargetkan hingga 100 item yang berbeda dalam satu atau lebih tabel DynamoDB dalam akun AWS yang sama dan di Wilayah yang sama. Ukuran agregat item dalam transaksi tidak dapat melebihi 4 MB. Tindakan tersebut diselesaikan secara atomik, sehingga semuanya berhasil atau tidak satu pun yang berhasil.
catatan
-
Operasi
TransactWriteItems
berbeda dari operasiBatchWriteItem
dalam hal semua tindakan yang di dalamnya harus berhasil diselesaikan, atau tidak ada perubahan yang dibuat sama sekali. Dengan operasiBatchWriteItem
, mungkin bahwa hanya beberapa tindakan dalam batch yang berhasil sementara yang lain tidak. -
Transaksi tidak dapat dilakukan dengan menggunakan indeks.
Anda tidak dapat menargetkan item yang sama dengan beberapa operasi dalam transaksi yang sama. Misalnya, Anda tidak dapat melakukan ConditionCheck
dan juga tindakan Update
pada item yang sama dalam transaksi yang sama.
Anda dapat menambahkan jenis tindakan berikut pada transaksi:
-
Put
— Memulai operasiPutItem
untuk membuat item baru atau mengganti item lama dengan item baru, kondisional atau tanpa menentukan syarat apa pun. -
Update
— Memulai operasiUpdateItem
untuk mengedit atribut item yang ada atau menambahkan item baru ke tabel jika belum ada. Gunakan tindakan ini untuk menambah, menghapus, atau memperbarui atribut pada item yang ada secara dengan syarat maupun tanpa syarat. -
Delete
— Memulai operasiDeleteItem
untuk menghapus satu item dalam tabel yang diidentifikasi oleh kunci primernya. -
ConditionCheck
— Memeriksa bahwa item ada atau periksa kondisi atribut tertentu dari item.
Setelah transaksi selesai, perubahan yang dibuat dalam transaksi yang dipropagasikan ke indeks sekunder global (GSI), stream, dan cadangan. Karena propagasi tidak langsung atau instan, jika tabel dipulihkan dari backup (RestoreTableFromBackup) atau diekspor ke titik waktu (ExportTableToPointInTime) pertengahan propagasi, mungkin berisi beberapa tetapi tidak semua perubahan yang dibuat selama transaksi baru-baru ini.
Idempotensi
Anda dapat menyertakan token klien ketika Anda membuat panggilan TransactWriteItems
untuk memastikan bahwa permintaan tersebut idempoten. Menjadikan transaksi Anda idempoten membantu mencegah kesalahan aplikasi jika operasi yang sama diajukan beberapa kali karena waktu habis koneksi atau masalah konektivitas lainnya.
Jika panggilan TransactWriteItems
asli berhasil, panggilan TransactWriteItems
berikutnya dengan token klien yang sama berhasil kembali tanpa membuat perubahan apa pun. Jika parameter ReturnConsumedCapacity
diatur, panggilan TransactWriteItems
awal mengembalikan jumlah unit kapasitas tulis yang dikonsumsi dalam membuat perubahan. Panggilan TransactWriteItems
selanjutnya dengan token klien yang sama mengembalikan jumlah unit kapasitas baca yang dikonsumsi dalam membaca item.
Poin penting tentang idempotensi
-
Token klien berlaku selama 10 menit setelah permintaan yang menggunakannya selesai. Setelah 10 menit, setiap permintaan yang menggunakan token klien yang sama diperlakukan sebagai permintaan baru. Anda tidak boleh menggunakan kembali token klien yang sama untuk permintaan yang sama setelah 10 menit.
-
Jika Anda mengulangi permintaan dengan token klien yang sama dalam jendela idempotensi 10 menit tetapi mengubah beberapa parameter permintaan lainnya, DynamoDB mengembalikan pengecualian
IdempotentParameterMismatch
.
Penanganan kesalahan untuk penulisan
Transaksi tulis tidak berhasil dalam situasi berikut:
-
Ketika syarat di salah satu ekspresisyarat tidak terpenuhi.
-
Ketika kesalahan validasi transaksi terjadi karena lebih dari satu tindakan dalam operasi
TransactWriteItems
yang sama menargetkan item yang sama. -
Saat permintaan
TransactWriteItems
bertentangan dengan operasiTransactWriteItems
yang sedang berlangsung pada satu atau lebih item dalam permintaanTransactWriteItems
. Dalam kasus ini, permintaan gagal denganTransactionCanceledException
. -
Ketika ada kapasitas yang ditetapkan tidak mencukupi untuk penyelesaian transaksi.
-
Ketika ukuran item menjadi terlalu besar (lebih besar dari 400 KB), atau indeks sekunder lokal (LSI) menjadi terlalu besar, atau kesalahan validasi serupa terjadi karena perubahan yang dilakukan oleh transaksi.
-
Ketika ada kesalahan pengguna, seperti format data yang tidak valid.
Untuk informasi selengkapnya tentang bagaimana pertentangan dengan operasi TransactWriteItems
ditangani, lihat Penanganan konflik transaksi di DynamoDB.
TransactGetItems API
TransactGetItems
adalah operasi baca sinkron yang mengelompokkan hingga 100 tindakan Get
menjadi satu. Tindakan ini dapat menargetkan hingga 100 item yang berbeda dalam satu atau lebih tabel DynamoDB dalam akun AWS dan Wilayah yang sama. Ukuran agregat item dalam transaksi tidak dapat melebihi 4 MB.
Tindakan Get
dilakukan secara atom sehingga semuanya berhasil atau semuanya gagal:
-
Get
— Memulai operasiGetItem
untuk mengambil satu set atribut untuk item dengan kunci primer yang diberikan. Jika tidak ditemukan item yang cocok,Get
tidak mengembalikan data apa pun.
Penanganan kesalahan untuk pembacaan
Transaksi baca tidak berhasil dalam situasi berikut:
-
Saat permintaan
TransactGetItems
bertentangan dengan operasiTransactWriteItems
yang sedang berlangsung pada satu atau lebih item dalam permintaanTransactGetItems
. Dalam kasus ini, permintaan gagal denganTransactionCanceledException
. -
Ketika ada kapasitas yang ditetapkan tidak mencukupi untuk penyelesaian transaksi.
-
Ketika ada kesalahan pengguna, seperti format data yang tidak valid.
Untuk informasi selengkapnya tentang bagaimana pertentangan dengan operasi TransactGetItems
ditangani, lihat Penanganan konflik transaksi di DynamoDB.
Tingkat isolasi untuk DynamoDB transactions
Tingkat isolasi operasi transaksional (TransactWriteItems
atau TransactGetItems
) dan operasi lainnya adalah sebagai berikut.
DAPAT DISERIALKAN
Isolasi yang dapat diserialkan memastikan bahwa hasil dari beberapa operasi bersamaan sama seperti jika tidak ada operasi dimulai hingga operasi sebelumnya telah selesai.
Ada isolasi serialisasi antara jenis operasi berikut:
-
Antara operasi transaksional dan operasi tulis standar (
PutItem
,UpdateItem
, atauDeleteItem
). -
Antara operasi transaksional dan operasi baca standar (
GetItem
). -
Antara operasi
TransactWriteItems
dan operasiTransactGetItems
.
Meskipun ada isolasi serialisasi antara operasi transaksional, dan setiap standar individu menulis dalam suatu BatchWriteItem
operasi, tidak ada isolasi serial antara transaksi dan operasi sebagai satu unit. BatchWriteItem
Demikian pula, tingkat isolasi antara operasi transaksional dan individu GetItems
dalam operasi BatchGetItem
dapat diserialisasikan. Tetapi tahap isolasi antara transaksi dan operasi BatchGetItem
sebagai unit adalah read-committed.
Permintaan GetItem
tunggal dapat diserialisasikan sehubungan dengan permintaan TransactWriteItems
dalam salah satu dari dua cara, baik sebelum atau setelah permintaan TransactWriteItems
. Beberapa permintaan GetItem
, terhadap kunci dalam permintaan TransactWriteItems
bersamaan dapat dijalankan dalam urutan apa pun, dan karena itu hasilnya read-committed.
Misalnya, jika permintaan GetItem
untuk item A dan item B dijalankan bersamaan dengan permintaan TransactWriteItems
yang memodifikasi item A dan item B, ada empat kemungkinan:
-
Kedua permintaan
GetItem
dijalankan sebelum permintaanTransactWriteItems
. -
Kedua permintaan
GetItem
dijalankan setelah permintaanTransactWriteItems
. -
Permintaan
GetItem
untuk item A dijalankan sebelum permintaanTransactWriteItems
. Untuk item B,GetItem
dijalankan setelahTransactWriteItems
. -
Permintaan
GetItem
untuk item B dijalankan sebelum permintaanTransactWriteItems
. Untuk item A,GetItem
dijalankan setelahTransactWriteItems
.
Anda harus menggunakan TransactGetItems
jika Anda lebih suka tingkat isolasi serial untuk beberapa permintaan. GetItem
Jika pembacaan non-transaksional dilakukan pada beberapa item yang merupakan bagian dari permintaan penulisan transaksi yang sama dalam penerbangan, Anda mungkin dapat membaca status baru dari beberapa item dan status lama item lainnya. Anda akan dapat membaca status baru dari semua item yang merupakan bagian dari permintaan penulisan transaksi hanya ketika respons berhasil diterima untuk penulisan transaksional.
READ-COMMITTED
Isolasi read-commit memastikan bahwa operasi baca selalu mengembalikan komitmen untuk suatu item - pembacaan tidak akan pernah menampilkan tampilan ke item yang mewakili keadaan dari penulisan transaksional yang pada akhirnya tidak berhasil. Isolasi komitmen baca tidak mencegah modifikasi item segera setelah operasi baca.
Tingkat isolasi read-committed antara operasi transaksional dan operasi baca yang melibatkan beberapa baca standar (BatchGetItem
, Query
, atau Scan
). Jika transaksional tulis memperbarui item di tengah operasi BatchGetItem
, Query
, atau Scan
, bagian selanjutnya dari operasi baca mengembalikan nilai berkomitmen baru (dengan ConsistentRead)
atau mungkin nilai berkomitmen sebelumnya (bacaan akhir konsisten).
Ringkasan operasi
Untuk meringkas, tabel berikut menunjukkan tingkat isolasi antara operasi transaksi (TransactWriteItems
atau TransactGetItems
) dan operasi lainnya.
Operasi | Tingkat Isolasi |
---|---|
|
Dapat diserialkan |
|
Dapat diserialkan |
|
Dapat diserialkan |
|
Dapat diserialkan |
|
Read-committed* |
|
Tidak Dapat Diserialkan* |
|
Read-committed |
|
Read-committed |
Operasi transaksional lainnya |
Dapat diserialkan |
Tingkat yang ditandai dengan tanda bintang (*) berlaku untuk operasi sebagai sebuah unit. Namun, tindakan individu dalam operasi tersebut memiliki tingkat isolasi yang dapat diserialkan.
Penanganan konflik transaksi di DynamoDB
Konflik transaksional dapat terjadi selama permintaan tingkat item bersamaan pada item dalam transaksi. Konflik transaksi dapat terjadi dalam skenario berikut:
-
Permintaan
PutItem
,UpdateItem
, atauDeleteItem
untuk item yang bertentangan dengan permintaanTransactWriteItems
yang sedang berlangsung yang mencakup item yang sama. -
Item dalam permintaan
TransactWriteItems
adalah bagian dari permintaanTransactWriteItems
lain yang sedang berlangsung. -
Item dalam permintaan
TransactGetItems
adalah bagian dari permintaanTransactWriteItems
,BatchWriteItem
,PutItem
,UpdateItem
, atauDeleteItem
yang sedang berlangsung.
catatan
-
Saat permintaan
PutItem
,UpdateItem
, atauDeleteItem
ditolak, permintaan gagal denganTransactionConflictException
. -
Jika ada permintaan tingkat item dalam
TransactWriteItems
atauTransactGetItems
ditolak, permintaan gagal denganTransactionCanceledException
. Jika permintaan tersebut gagal, SDK AWS tidak mencoba lagi permintaan.Jika Anda menggunakanAWS SDK for Java, pengecualian berisi daftar CancellationReasons, diurutkan sesuai dengan daftar item dalam parameter
TransactItems
permintaan. Untuk bahasa lain, representasi string daftar disertakan dalam pesan kesalahan pengecualian. -
Jika operasi
TransactWriteItems
atauTransactGetItems
yang sedang berlangsung bertentangan dengan permintaanGetItem
bersamaan, kedua operasi dapat berhasil.
TransactionConflict CloudWatch Metrik ditambahkan untuk setiap permintaan tingkat item yang gagal.
Menggunakan API Transaksional di DynamoDB Accelerator (DAX)
TransactWriteItems
dan TransactGetItems
keduanya didukung di DynamoDB Accelerator (DAX) dengan tingkat isolasi yang sama seperti di DynamoDB.
TransactWriteItems
menulis melalui DAX. DAX menyampaikan panggilan TransactWriteItems
ke DynamoDB dan mengembalikan respons. Untuk mempopulasi cache setelah menulis, DAX memanggil TransactGetItems
di latar belakang untuk setiap item dalam operasi TransactWriteItems
, yang mengonsumsi unit kapasitas baca tambahan. (Untuk informasi selengkapnya, lihat Manajemen kapasitas untuk transaksi.) Fungsionalitas ini memungkinkan Anda untuk menjaga logika aplikasi Anda sederhana dan menggunakan DAX untuk kedua operasi transaksional dan nontransaksional.
Panggilan TransactGetItems
disampaikan melalui DAX tanpa item di-cache secara lokal. Ini adalah perilaku yang sama seperti untuk API bacaan sangat konsisten di DAX.
Manajemen kapasitas untuk transaksi
Tidak ada biaya tambahan untuk mengaktifkan transaksi untuk tabel DynamoDB Anda. Anda hanya membayar untuk baca atau tulis yang merupakan bagian dari transaksi Anda. DynamoDB melakukan dua baca atau tulis mendasar dari setiap item dalam transaksi: satu untuk mempersiapkan transaksi dan satu untuk melakukan transaksi. Dua operasi baca/tulis yang mendasarinya terlihat di metrik Amazon CloudWatch Anda.
Rencana untuk baca dan tulis tambahan yang diperlukan oleh API transaksional ketika Anda menyediakan kapasitas untuk tabel Anda. Misalnya, anggaplah aplikasi Anda menjalankan satu transaksi per detik, dan setiap transaksi menulis tiga item 500-byte dalam tabel Anda. Setiap item membutuhkan dua unit kapasitas tulis (WCU): satu untuk mempersiapkan transaksi dan satu untuk melakukan transaksi. Oleh karena itu, Anda akan perlu untuk menyediakan enam WCU pada tabel.
Jika Anda menggunakan DynamoDB Accelerator (DAX) dalam contoh sebelumnya, Anda juga akan menggunakan dua unit kapasitas baca (RCU) untuk setiap item di panggilan TransactWriteItems
. Jadi Anda akan perlu untuk menyediakan enam RCU tambahan pada tabel.
Demikian pula, jika aplikasi Anda menjalankan satu transaksi baca per detik, dan setiap transaksi membaca tiga item berukuran 500 byte di tabel Anda, Anda perlu menyediakan enam unit kapasitas baca (RCU) ke tabel tersebut. Membaca setiap item membutuhkan dua RCU: satu untuk mempersiapkan transaksi dan satu untuk melakukan transaksi.
Selain itu, perilaku SDK default adalah untuk mencoba lagi transaksi dalam kasus pengecualian TransactionInProgressException
. Rencanakan tambahan unit kapasitas baca (RCU) yang digunakan oleh percobaan ulang ini. Hal yang sama juga berlaku jika Anda mencoba ulang transaksi dalam kode Anda sendiri menggunakan ClientRequestToken
.
Praktik terbaik untuk transactions
Pertimbangkan praktik yang disarankan berikut saat menggunakan DynamoDB Transactions.
-
Aktifkan penskalaan otomatis pada tabel Anda, atau pastikan bahwa Anda telah menyediakan kapasitas throughput yang cukup untuk melakukan dua operasi baca atau tulis untuk setiap item dalam transaksi Anda.
-
Jika Anda tidak menggunakan SDK yang disediakan AWS, sertakan atribut
ClientRequestToken
ketika Anda membuat panggilanTransactWriteItems
untuk memastikan bahwa permintaan tersebut idempoten. -
Jangan mengelompokkan operasi bersama-sama dalam sebuah transaksi jika tidak diperlukan. Misalnya, jika satu transaksi dengan 10 operasi dapat dipecah menjadi beberapa transaksi tanpa mengurangi kebenaran aplikasi, sebaiknya pisahkan transaksi tersebut. Transaksi yang lebih sederhana meningkatkan throughput dan lebih mungkin untuk berhasil.
-
Beberapa transaksi memperbarui item yang sama secara bersamaan dapat menyebabkan konflik yang membatalkan transaksi. Kami merekomendasikan praktik terbaik DynamoDB berikut untuk pemodelan data untuk meminimalkan konflik tersebut.
-
Jika satu set atribut sering diperbarui di beberapa item sebagai bagian dari transaksi tunggal, pertimbangkan pengelompokan atribut menjadi satu item untuk mengurangi lingkup transaksi.
-
Hindari penggunaan transaksi untuk menyerap data secara massal. Untuk tulis massal, lebih baik menggunakan
BatchWriteItem
.
Menggunakan API transaksional dengan tabel global
Operasi yang terkandung dalam transaksi DynamoDB hanya dijamin transaksional di wilayah tempat transaksi awalnya dijalankan. Transaksionalitas tidak dipertahankan ketika perubahan yang diterapkan dalam transaksi direplikasi di seluruh Wilayah ke replika tabel global.
Transaksi DynamoDB AWSLabs vs. perpustakaan klien transaksi
Transaksi DynamoDB menyediakan penggantian yang lebih hemat biaya, kuat, dan berkinerja untuk perpustakaan klien transaksi. AWSLabs