Lakukan operasi transaksi - AWS SDK for Java 2.x

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

Lakukan operasi transaksi

DynamoDB Enhanced Client API menyediakan dan metodetransactGetItems(). transactWriteItems() Metode transaksi SDK for Java memberikan atomisitas, konsistensi, isolasi, dan daya tahan (ACID) dalam tabel DynamoDB, membantu Anda menjaga kebenaran data dalam aplikasi Anda.

Contoh transactGetItems()

transactGetItems()Metode ini menerima hingga 100 permintaan individu untuk item. Semua item dibaca dalam satu transaksi atom. Panduan Pengembang Amazon DynamoDB memiliki informasi tentang kondisi yang menyebabkan transactGetItems() metode gagal, dan juga tentang tingkat isolasi yang digunakan saat Anda menelepon. transactGetItem()

Setelah baris komentar 1 dalam contoh berikut, kode memanggil transactGetItems() metode dengan builder parameter. Builder addGetItem() dipanggil tiga kali dengan objek data yang berisi nilai kunci yang akan digunakan SDK untuk menghasilkan permintaan akhir.

Permintaan mengembalikan daftar Document objek setelah baris komentar 2. Daftar dokumen yang dikembalikan berisi contoh dokumen non-null dari data item dalam urutan yang sama seperti yang diminta. Document.getItem(MappedTableResource<T> mappedTableResource)Metode mengkonversi objek untyped menjadi Document objek Java diketik jika data item dikembalikan, jika tidak metode mengembalikan null.

public static void transactGetItemsExample(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<ProductCatalog> catalogTable, DynamoDbTable<MovieActor> movieActorTable) { // 1. Request three items from two tables using a builder. final List<Document> documents = enhancedClient.transactGetItems(b -> b .addGetItem(catalogTable, Key.builder().partitionValue(2).sortValue("Title 55").build()) .addGetItem(movieActorTable, Key.builder().partitionValue("Sophie's Choice").sortValue("Meryl Streep").build()) .addGetItem(movieActorTable, Key.builder().partitionValue("Blue Jasmine").sortValue("Cate Blanchett").build()) .build()); // 2. A list of Document objects is returned in the same order as requested. ProductCatalog title55 = documents.get(0).getItem(catalogTable); if (title55 != null) { logger.info(title55.toString()); } MovieActor sophiesChoice = documents.get(1).getItem(movieActorTable); if (sophiesChoice != null) { logger.info(sophiesChoice.toString()); } // 3. The getItem() method returns null if the Document object contains no item from DynamoDB. MovieActor blueJasmine = documents.get(2).getItem(movieActorTable); if (blueJasmine != null) { logger.info(blueJasmine.toString()); } }

Tabel DynamoDB berisi item berikut sebelum contoh kode berjalan.

ProductCatalog{id=2, title='Title 55', isbn='orig_isbn', authors=[b, g], price=10} MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'}

Output berikut dicatat. Jika item diminta tetapi tidak ditemukan, itu tidak dikembalikan seperti halnya permintaan untuk film bernamaBlue Jasmine.

ProductCatalog{id=2, title='Title 55', isbn='orig_isbn', authors=[b, g], price=10} MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'}

transactWriteItems() contoh

transactWriteItems()Menerima hingga 100 tindakan put, update, atau delete dalam satu transaksi atom di beberapa tabel. Panduan Pengembang Amazon DynamoDB berisi rincian tentang pembatasan dan kondisi kegagalan operasi layanan DynamoDB yang mendasarinya.

Contoh basic

Dalam contoh berikut, empat operasi diminta untuk dua tabel. Kelas model yang sesuai ProductCatalogdan ditunjukkan MovieActorsebelumnya.

Masing-masing dari tiga kemungkinan operasi—put, update, dan delete—menggunakan parameter permintaan khusus untuk menentukan detailnya.

Kode setelah baris komentar 1 menunjukkan variasi sederhana dari addPutItem() metode ini. Metode ini menerima MappedTableResource objek dan contoh objek data untuk dimasukkan. Pernyataan setelah komentar baris 2 menunjukkan variasi yang menerima TransactPutItemEnhancedRequest instance. Variasi ini memungkinkan Anda menambahkan lebih banyak opsi dalam permintaan, seperti ekspresi kondisi. Contoh selanjutnya menunjukkan ekspresi kondisi untuk operasi individu.

Operasi pembaruan diminta setelah baris komentar 3. TransactUpdateItemEnhancedRequestmemiliki ignoreNulls() metode yang memungkinkan Anda mengonfigurasi apa yang dilakukan SDK dengan null nilai pada objek model. Jika ignoreNulls() metode mengembalikan true, SDK tidak menghapus nilai atribut tabel untuk atribut objek data yangnull. Jika ignoreNulls() metode mengembalikan false, SDK meminta layanan DynamoDB untuk menghapus atribut dari item dalam tabel. Nilai default untuk ignoreNulls adalah false.

Pernyataan setelah baris komentar 4 menunjukkan variasi permintaan hapus yang mengambil objek data. Klien yang disempurnakan mengekstrak nilai-nilai kunci sebelum mengirimkan permintaan akhir.

public static void transactWriteItems(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<ProductCatalog> catalogTable, DynamoDbTable<MovieActor> movieActorTable) { enhancedClient.transactWriteItems(b -> b // 1. Simplest variation of put item request. .addPutItem(catalogTable, getProductCatId2()) // 2. Put item request variation that accommodates condition expressions. .addPutItem(movieActorTable, TransactPutItemEnhancedRequest.builder(MovieActor.class) .item(getMovieActorStreep()) .conditionExpression(Expression.builder().expression("attribute_not_exists (movie)").build()) .build()) // 3. Update request that does not remove attribute values on the table if the data object's value is null. .addUpdateItem(catalogTable, TransactUpdateItemEnhancedRequest.builder(ProductCatalog.class) .item(getProductCatId4ForUpdate()) .ignoreNulls(Boolean.TRUE) .build()) // 4. Variation of delete request that accepts a data object. The key values are extracted for the request. .addDeleteItem(movieActorTable, getMovieActorBlanchett()) ); }

Metode pembantu berikut menyediakan objek data untuk add*Item parameter.

public static ProductCatalog getProductCatId2() { return ProductCatalog.builder() .id(2) .isbn("1-565-85698") .authors(new HashSet<>(Arrays.asList("a", "b"))) .price(BigDecimal.valueOf(30.22)) .title("Title 55") .build(); } public static ProductCatalog getProductCatId4ForUpdate() { return ProductCatalog.builder() .id(4) .price(BigDecimal.valueOf(40.00)) .title("Title 1") .build(); } public static MovieActor getMovieActorBlanchett() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Cate Blanchett"); movieActor.setMovieName("Tar"); movieActor.setActingYear(2022); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("National Institute of Dramatic Art"); return movieActor; } public static MovieActor getMovieActorStreep() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Meryl Streep"); movieActor.setMovieName("Sophie's Choice"); movieActor.setActingYear(1982); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("Yale School of Drama"); return movieActor; }

Tabel DynamoDB berisi item berikut sebelum contoh kode berjalan.

1 | ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10} 2 | MovieActor{movieName='Tar', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2022, actingSchoolName='National Institute of Dramatic Art'}

Item berikut ada di tabel setelah kode selesai berjalan.

3 | ProductCatalog{id=2, title='Title 55', isbn='1-565-85698', authors=[a, b], price=30.22} 4 | ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=40.0} 5 | MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'}

Item pada baris 2 telah dihapus dan baris 3 dan 5 menunjukkan item yang diletakkan. Baris 4 menunjukkan pembaruan baris 1. priceNilai adalah satu-satunya nilai yang berubah pada item. Jika ignoreNulls() telah mengembalikan false, baris 4 akan terlihat seperti baris berikut.

ProductCatalog{id=4, title='Title 1', isbn='null', authors=null, price=40.0}

Contoh pemeriksaan kondisi

Contoh berikut menunjukkan penggunaan pemeriksaan kondisi. Pemeriksaan kondisi digunakan untuk memeriksa apakah ada item atau untuk memeriksa kondisi atribut tertentu dari suatu item dalam database. Item yang dicek dalam pemeriksaan kondisi tidak dapat digunakan dalam operasi lain dalam transaksi.

catatan

Anda tidak dapat menargetkan item yang sama dengan beberapa operasi dalam transaksi yang sama. Misalnya, Anda tidak dapat melakukan pemeriksaan kondisi dan juga mencoba memperbarui item yang sama dalam transaksi yang sama.

Contoh menunjukkan salah satu dari setiap jenis operasi dalam permintaan item tulis transaksional. Setelah baris komentar 2, addConditionCheck() metode memasok kondisi yang gagal transaksi jika conditionExpression parameter mengevaluasifalse. Ekspresi kondisi yang dikembalikan dari metode yang ditampilkan dalam blok Metode Pembantu memeriksa apakah tahun penghargaan untuk film Sophie's Choice tidak sama dengan. 1982 Jika ya, ekspresi mengevaluasi false dan transaksi gagal.

Panduan ini membahas ekspresi secara mendalam dalam topik lain.

public static void conditionCheckFailExample(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<ProductCatalog> catalogTable, DynamoDbTable<MovieActor> movieActorTable) { try { enhancedClient.transactWriteItems(b -> b // 1. Perform one of each type of operation with the next three methods. .addPutItem(catalogTable, TransactPutItemEnhancedRequest.builder(ProductCatalog.class) .item(getProductCatId2()).build()) .addUpdateItem(catalogTable, TransactUpdateItemEnhancedRequest.builder(ProductCatalog.class) .item(getProductCatId4ForUpdate()) .ignoreNulls(Boolean.TRUE).build()) .addDeleteItem(movieActorTable, TransactDeleteItemEnhancedRequest.builder() .key(b1 -> b1 .partitionValue(getMovieActorBlanchett().getMovieName()) .sortValue(getMovieActorBlanchett().getActorName())).build()) // 2. Add a condition check on a table item that is not involved in another operation in this request. .addConditionCheck(movieActorTable, ConditionCheck.builder() .conditionExpression(buildConditionCheckExpression()) .key(k -> k .partitionValue("Sophie's Choice") .sortValue("Meryl Streep")) // 3. Specify the request to return existing values from the item if the condition evaluates to true. .returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) .build()) .build()); // 4. Catch the exception if the transaction fails and log the information. } catch (TransactionCanceledException ex) { ex.cancellationReasons().stream().forEach(cancellationReason -> { logger.info(cancellationReason.toString()); }); } }

Metode pembantu berikut digunakan dalam contoh kode sebelumnya.

private static Expression buildConditionCheckExpression() { Map<String, AttributeValue> expressionValue = Map.of( ":year", numberValue(1982)); return Expression.builder() .expression("actingyear <> :year") .expressionValues(expressionValue) .build(); } public static ProductCatalog getProductCatId2() { return ProductCatalog.builder() .id(2) .isbn("1-565-85698") .authors(new HashSet<>(Arrays.asList("a", "b"))) .price(BigDecimal.valueOf(30.22)) .title("Title 55") .build(); } public static ProductCatalog getProductCatId4ForUpdate() { return ProductCatalog.builder() .id(4) .price(BigDecimal.valueOf(40.00)) .title("Title 1") .build(); } public static MovieActor getMovieActorBlanchett() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Cate Blanchett"); movieActor.setMovieName("Blue Jasmine"); movieActor.setActingYear(2013); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("National Institute of Dramatic Art"); return movieActor; }

Tabel DynamoDB berisi item berikut sebelum contoh kode berjalan.

1 | ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10} 2 | MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'} 3 | MovieActor{movieName='Tar', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2022, actingSchoolName='National Institute of Dramatic Art'}

Item berikut ada di tabel setelah kode selesai berjalan.

ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10} MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'} MovieActor{movieName='Tar', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2022, actingSchoolName='National Institute of Dramatic Art'}

Item tetap tidak berubah dalam tabel karena transaksi gagal. actingYearNilai untuk film Sophie's Choice adalah1982, seperti yang ditunjukkan pada baris 2 item dalam tabel sebelum transactWriteItem() metode dipanggil.

Untuk menangkap informasi pembatalan untuk transaksi, lampirkan panggilan transactWriteItems() metode dalam try blok dancatch. TransactionCanceledException Setelah baris komentar 4 dari contoh, kode mencatat setiap CancellationReason objek. Karena kode berikut baris komentar 3 dari contoh menentukan bahwa nilai harus dikembalikan untuk item yang menyebabkan transaksi gagal, log menampilkan nilai database mentah untuk item Sophie's Choice film.

CancellationReason(Code=None) CancellationReason(Code=None) CancellationReason(Code=None) CancellationReason(Item={actor=AttributeValue(S=Meryl Streep), movie=AttributeValue(S=Sophie's Choice), actingaward=AttributeValue(S=Best Actress), actingyear=AttributeValue(N=1982), actingschoolname=AttributeValue(S=Yale School of Drama)}, ¬ Code=ConditionalCheckFailed, Message=The conditional request failed.)

Contoh kondisi operasi tunggal

Contoh berikut menunjukkan penggunaan kondisi pada operasi tunggal dalam permintaan transaksi. Operasi hapus setelah baris komentar 1 berisi kondisi yang memeriksa nilai item target operasi terhadap database. Dalam contoh ini, ekspresi kondisi yang dibuat dengan metode pembantu setelah baris komentar 2 menentukan bahwa item harus dihapus dari database jika tahun akting film tidak sama dengan 2013.

Ekspresi dibahas nanti dalam panduan ini.

public static void singleOperationConditionFailExample(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<ProductCatalog> catalogTable, DynamoDbTable<MovieActor> movieActorTable) { try { enhancedClient.transactWriteItems(b -> b .addPutItem(catalogTable, TransactPutItemEnhancedRequest.builder(ProductCatalog.class) .item(getProductCatId2()) .build()) .addUpdateItem(catalogTable, TransactUpdateItemEnhancedRequest.builder(ProductCatalog.class) .item(getProductCatId4ForUpdate()) .ignoreNulls(Boolean.TRUE).build()) // 1. Delete operation that contains a condition expression .addDeleteItem(movieActorTable, TransactDeleteItemEnhancedRequest.builder() .key((Key.Builder k) -> { MovieActor blanchett = getMovieActorBlanchett(); k.partitionValue(blanchett.getMovieName()) .sortValue(blanchett.getActorName()); }) .conditionExpression(buildDeleteItemExpression()) .returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) .build()) .build()); } catch (TransactionCanceledException ex) { ex.cancellationReasons().forEach(cancellationReason -> logger.info(cancellationReason.toString())); } } // 2. Provide condition expression to check if 'actingyear' is not equal to 2013. private static Expression buildDeleteItemExpression() { Map<String, AttributeValue> expressionValue = Map.of( ":year", numberValue(2013)); return Expression.builder() .expression("actingyear <> :year") .expressionValues(expressionValue) .build(); }

Metode pembantu berikut digunakan dalam contoh kode sebelumnya.

public static ProductCatalog getProductCatId2() { return ProductCatalog.builder() .id(2) .isbn("1-565-85698") .authors(new HashSet<>(Arrays.asList("a", "b"))) .price(BigDecimal.valueOf(30.22)) .title("Title 55") .build(); } public static ProductCatalog getProductCatId4ForUpdate() { return ProductCatalog.builder() .id(4) .price(BigDecimal.valueOf(40.00)) .title("Title 1") .build(); } public static MovieActor getMovieActorBlanchett() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Cate Blanchett"); movieActor.setMovieName("Blue Jasmine"); movieActor.setActingYear(2013); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("National Institute of Dramatic Art"); return movieActor; }

Tabel DynamoDB berisi item berikut sebelum contoh kode berjalan.

1 | ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10} 2 | MovieActor{movieName='Blue Jasmine', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2013, actingSchoolName='National Institute of Dramatic Art'}

Item berikut ada di tabel setelah kode selesai berjalan.

ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10} 2023-03-15 11:29:07 [main] INFO org.example.tests.TransactDemoTest:168 - MovieActor{movieName='Blue Jasmine', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2013, actingSchoolName='National Institute of Dramatic Art'}

Item tetap tidak berubah dalam tabel karena transaksi gagal. actingYearNilai untuk film Blue Jasmine adalah 2013 seperti yang ditunjukkan pada baris 2 dalam daftar item sebelum contoh kode berjalan.

Baris berikut dicatat ke konsol.

CancellationReason(Code=None) CancellationReason(Code=None) CancellationReason(Item={actor=AttributeValue(S=Cate Blanchett), movie=AttributeValue(S=Blue Jasmine), actingaward=AttributeValue(S=Best Actress), actingyear=AttributeValue(N=2013), actingschoolname=AttributeValue(S=National Institute of Dramatic Art)}, Code=ConditionalCheckFailed, Message=The conditional request failed)