به عنوان نمونه ای از وضعیتی که در آن معاملات DynamoDB آمازون می تواند مفید باشد ، این نمونه برنامه جاوا را برای یک بازار آنلاین در نظر بگیرید.
برنامه دارای سه جدول DynamoDB در پس زمینه است:
- مشتریان - این جدول جزئیات مربوط به مشتریان بازار را ذخیره می کند. کلید اصلی آن شناسه منحصر به فرد مشتری است.
- ProductCatalog - این جدول جزئیاتی از قبیل قیمت و در دسترس بودن محصولات برای فروش در بازار را ذخیره می کند. کلید اصلی آن یک شناسه منحصر به فرد ProductId است.
- سفارشات - این جدول جزئیات مربوط به سفارشات موجود در بازار را ارائه می دهد. کلید اصلی آن یک شناسه منحصر به فرد OrderID است.
سفارش
قطعه های کد زیر نحوه استفاده از معاملات DynamoDB را برای هماهنگی چندین مرحله که برای ایجاد و پردازش سفارش لازم است ، نشان می دهد. استفاده از یک عملیات واحد و یا هیچ چیز تضمین می کند که در صورت عدم موفقیت هر بخشی از معامله ، هیچ اقدامی در معامله انجام نشود و هیچ تغییری ایجاد نشود.
در این مثال ، شما از مشتری سفارش می دهید که مشتری آن 09E8E9C8-EC48 است. سپس آن را به عنوان یک معامله واحد با استفاده از گردش کار ساده پردازش سفارش زیر اجرا می کنید:
- تعیین کنید که شناسه مشتری معتبر است.
- اطمینان حاصل کنید که محصول IN_STOCK است و وضعیت محصول را برای فروخته شده به روز کنید.
- اطمینان حاصل کنید که سفارش از قبل وجود ندارد و سفارش را ایجاد کنید.
مشتری را تأیید کنید
ابتدا اقدامی را برای تأیید اینکه مشتری با مشتری برابر برابر با 09E8E9C8-EC48 در جدول مشتری وجود دارد ، تعریف کنید.
string string customer_table_name = "مشتریان" ؛string string uplion_partition_key = "customerId" ؛string string industruderid = "09e8e9c8-ec48" ؛Final HashMap CustomerItemkey = HashMap جدید<>() ؛CustomerItemKey. put (مشتری_پارتیس_کی ، ویژگی جدید (مشتری id)) ؛ContrityCheck CheckCustomerValid = New ContrityCheck ()
وضعیت محصول را به روز کنید
در مرحله بعد ، اگر شرط تنظیم وضعیت محصول در حال حاضر روی IN_STOCK درست است ، اقدامی را برای به روزرسانی وضعیت محصول برای فروخته شده تعریف کنید. اگر ویژگی وضعیت محصول مورد با IN_STOCK برابر نبود ، تنظیم پارامتر RetuValuesOnConditionCheckFailure مورد را برمی گرداند.
Final String product_table_name = "ProductCatalog" ؛Final String product_partition_key = "productId" ؛hashmap productitemkey = hashmap جدید<>()؛productItemKey. put(PRODUCT_PARTITION_KEY، AttributeValue جدید(productKey)); Map expressAttributeValues = HashMap جدید<>()؛expressAttributeValues. put(":new_status", new AttributeValue("فروش")); expressAttributeValues. put(":expected_status", new AttributeValue("IN_STOCK")); به روز رسانی markItemSold = به روز رسانی جدید () . withTableName(PRODUCT_TABLE_NAME) . withKey(productItemKey) . withUpdateExpression("SET ProductStatus = :new_status") . withExpressionAttributeValuestuest. وضعیت = :expected_status") . withRetuValuesOnConditionCheckFailure(RetuValuesOnConditionCheckFailure. ALL_OLD);
سفارش را ایجاد کنید
در نهایت، تا زمانی که سفارشی با آن OrderId وجود نداشته باشد، سفارش را ایجاد کنید.
رشته نهایی ORDER_PARTITION_KEY = "OrderId"; رشته نهایی ORDER_TABLE_NAME = "سفارش ها"; HashMap orderItem = HashMap جدید<>()؛orderItem. put(ORDER_PARTITION_KEY، AttributeValue جدید(orderId)); orderItem. put(PRODUCT_PARTITION_KEY، AttributeValue جدید(productKey)); orderItem. put(CUSTOMER_PARTITION_KEY، AttributeValue جدید(customerId)); orderItem. put("OrderStatus"، New AttributeValue("ConFIRMED")); orderItem. put("OrderTotal", new AttributeValue("100")); قرار دادن createOrder = new Put() . withTableName(ORDER_TABLE_NAME) . withItem(orderItem) . withRetuValuesOnConditionCheckFailure(RetuValuesOnConditionCheckFailure. ALL_OLD) . _KEY + ")");
تراکنش را اجرا کنید
مثال زیر نحوه اجرای اقداماتی را که قبلاً به عنوان یک عملیات همه یا هیچ تعریف شده بود، نشان می دهد.
Collection actions = Arrays.asList( new TransactWriteItem().withConditionCheck(checkCustomerValid), new TransactWriteItem().withUpdate(markItemSold), new TransactWriteItem().withPut(createOrder)); TransactWriteItemsRequest placeOrderTransaction = new TransactWriteItemsRequest() .withTransactItems(actions) .withRetuConsumedCapacity(RetuConsumedCapacity.TOTAL); // Run the transaction and process the result. try client.transactWriteItems(placeOrderTransaction); System.out.println("Transaction Successful");> catch (ResourceNotFoundException f) System.err.println("One of the table involved in the transaction is not found" + f.getMessage());> catch (IntealServerErrorException ise) System.err.println("Inteal Server Error" + ise.getMessage());> catch (TransactionCanceledException tce) System.out.println("Transaction Canceled " + tce.getMessage());>
خواندن جزئیات سفارش
مثال زیر نشان می دهد که چگونه می توان سفارش تکمیل شده را به صورت تراکنشی در جداول Orders و ProductCatalog خواند.
HashMap productItemKey = HashMap جدید<>()؛productItemKey. put(PRODUCT_PARTITION_KEY، AttributeValue جدید(productKey)); HashMap orderKey = HashMap جدید<>(); orderKey.put(ORDER_PARTITION_KEY, new AttributeValue(orderId)); Get readProductSold = new Get() .withTableName(PRODUCT_TABLE_NAME) .withKey(productItemKey); Get readCreatedOrder = new Get() .withTableName(ORDER_TABLE_NAME) .withKey(orderKey); Collection getActions = Arrays.asList( new TransactGetItem().withGet(readProductSold), new TransactGetItem().withGet(readCreatedOrder)); TransactGetItemsRequest readCompletedOrder = new TransactGetItemsRequest() .withTransactItems(getActions) .withRetuConsumedCapacity(RetuConsumedCapacity.TOTAL); // Run the transaction and process the result. try TransactGetItemsResult result = client.transactGetItems(readCompletedOrder); System.out.println(result.getResponses());> catch (ResourceNotFoundException f) System.err.println("One of the table involved in the transaction is not found" + f.getMessage());> catch (IntealServerErrorException ise) System.err.println("Inteal Server Error" + ise.getMessage());> catch (TransactionCanceledException tce) System.err.println("Transaction Canceled" + tce.getMessage());>
نمونه های اضافی
- استفاده از تراکنش های DynamoDBMapper
دوره ی فارکس...
ما را در سایت دوره ی فارکس دنبال می کنید
برچسب :
نویسنده : مهناز افشار
بازدید : 29
تاريخ : دوشنبه
13 شهريور
1402 ساعت: 18:15