From 530b9e966238c282db2dc3760384ae8326afb760 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 19 Sep 2017 20:39:48 +0530 Subject: [PATCH] #352- Unit Of Work : added the readme file --- unit-of-work/README.md | 31 +++++++++++++++++ unit-of-work/etc/unit-of-work.ucls | 48 ++++++++++++++++++++++++++ unit-of-work/etc/unit-of-work.urm.png | Bin 0 -> 19132 bytes 3 files changed, 79 insertions(+) create mode 100644 unit-of-work/README.md create mode 100644 unit-of-work/etc/unit-of-work.ucls create mode 100644 unit-of-work/etc/unit-of-work.urm.png diff --git a/unit-of-work/README.md b/unit-of-work/README.md new file mode 100644 index 000000000..b04311df8 --- /dev/null +++ b/unit-of-work/README.md @@ -0,0 +1,31 @@ +--- +layout: pattern +title: Unit Of Work +folder: unit-of-work +permalink: /patterns/unit-of-work/ +pumlid: +categories: Architectural +tags: + - Java + - KISS + - YAGNI + - Difficulty-Beginner +--- + +## Intent +When a business transaction is completed all the these updates are sent as one + big unit of work to be persisted in a database in one go so as to minimize database trips. + +![alt text](etc/unit-of-work.urm.png "unit-of-work") + +## Applicability +Use the Unit Of Work pattern when + +* The client is asking to optimize the time taken for database transactions. +* When you want to boost the performance to get database records. +* You want reduce number of database calls. + +## Credits + +* [Design Pattern - Unit Of Work Pattern](https://www.codeproject.com/Articles/581487/Unit-of-Work-Design-Pattern) +* [Unit Of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls new file mode 100644 index 000000000..15f777aad --- /dev/null +++ b/unit-of-work/etc/unit-of-work.ucls @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..46facff8dee4c45b2c6bbafb7ea6c3b6be80dfc3 GIT binary patch literal 19132 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 R(&9dol~j_*6aUNm{{y~+`I`U$ literal 0 HcmV?d00001