<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Design &amp; Architecture</title><link>https://www.dotnetzone.gr:443/cs/forums/16/ShowForum.aspx</link><description>Θέματα αρχιτεκτονικής και σχεδιασμού εφαρμογών (design patterns, object orientation, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18389.aspx</link><pubDate>Tue, 10 Oct 2006 21:46:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18389</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18389.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18389</wfw:commentRss><description>&lt;P&gt;Ξέχασα να αναφέρω ότι με το COM+ CRM, επιτυγχάνεις το "D" στα ACID properties, πράγμα που δεν είναι εύκολο να κάνεις με άλλον τρόπο και σαφώς δεν σε καλύπτει το σενάριο με το transaction που περιέγραψες. Αν για παράδειγμα χρειαστεί να κάνεις rollback (με την υλοποίηση που προτείνεις) και συμβεί ένα&amp;nbsp;καταστροφικό γεγονός&amp;nbsp;&lt;U&gt;αφού&lt;/U&gt; γίνει το rollback&amp;nbsp;στη βάση&amp;nbsp;αλλά &amp;nbsp;&lt;U&gt;πριν&lt;/U&gt; να γίνει το clean-up των αρχείων, τότε όταν θα επανέλθει το σύστημα θα έχεις dirty state καθώς δεν θα υπάρχει τρόπος να διαπιστώσει ότι πρέπει να κάνει το clean-up των αρχείων. To COM+ CRM κρατάει ένα log (που το ονομάζει "durable log") και πριν να κάνει οτιδήποτε κατά το commit ή το rollback καταγράφει εκεί τις ενέργειες που πρόκειται να συμβούν, κάτι δηλαδή σαν το transaction log σε μια βάση, μόνο που καταγράφει τις custom ενέργειες που έχεις ορίσει εσύ και πρόκειται να γίνουν. Έτσι, κατά το recovery, κάνει ανάλογα roll-forward&amp;nbsp;και&amp;nbsp;roll-back.&lt;/P&gt;</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18338.aspx</link><pubDate>Tue, 10 Oct 2006 08:24:44 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18338</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18338.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18338</wfw:commentRss><description>&lt;P&gt;Εγώ θα το έψαχνα προς την κατεύθυνση του COM+.&amp;nbsp;Το COM+ έχει ένα χαρακτηριστικό που ονομάζεται COM+ Compensating Resource Manager που ουσιαστικά σε βοηθάει ώστε το μόνο που έχεις να κάνεις είναι να ορίσεις το Action και το "Undo action". Χρησιμοποιείται όταν θες να δημιουργήσεις transactions που αποτελούνται από "περίεργα" resources. Περισσότερα εδώ: &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/ms684168.aspx"&gt;http://windowssdk.msdn.microsoft.com/en-us/library/ms684168.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18337.aspx</link><pubDate>Tue, 10 Oct 2006 07:18:38 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18337</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18337.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18337</wfw:commentRss><description>Ναί, ακριβώς έτσι, δυστυχώς ...</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18334.aspx</link><pubDate>Tue, 10 Oct 2006 06:10:43 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18334</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18334.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18334</wfw:commentRss><description>Ευχαριστώ για τις απαντήσεις. Σε αυτό το πλαίσιο κινούμε γενικά.&lt;br /&gt;
&lt;br /&gt;
Ναι, δουλεύω σε 2.0. Προφανώς μιλάς για distrubuted transactions. Αυτό όμως δεν σημαίνει ότι θα κάνω απλά ένα rollback και θα επαναφέρω τα αρχεία όπως ήταν. Σωστά; Θα πρέπει να εγώ να γράψω τον κώδικα που θα κάνει την επαναφορά. Τα distributed transactions απλά θα κάνουν τον κώδικά μου πιο φιλικό προς το περιβάλλον του (context).</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18330.aspx</link><pubDate>Tue, 10 Oct 2006 04:18:14 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18330</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18330.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18330</wfw:commentRss><description>Όλα αυτά γίνονται μέσα στον SQL σου, ή σε .NET&amp;nbsp; κώδικα; Κι αν το δεύτερο, σε τί version δουλεύεις;;;&amp;nbsp; Το λέω γιατί αν είσαι σε 2.0, μπορείς να εκμεταλευτείς το System.Transactions και να κάνεις τις κλάσσεις σου transaction-aware. &lt;br&gt;&lt;br&gt;Αλλιώς, μπορείς να πάρεις καποιες ιδέες απο τον κύριο &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/09/NETMatters/default.aspx"&gt;εδώ&lt;/a&gt;, και να "προσομοιώσεις" transactions, ακόμη και σε 1.1. ( Εύχομαι όμως να χρησιμοποιείς 2.0 :D ) &lt;br&gt;</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18327.aspx</link><pubDate>Tue, 10 Oct 2006 03:45:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18327</guid><dc:creator>dimkasta</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18327.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18327</wfw:commentRss><description>Αυτό που μπορείς να δοκιμάσεις είναι να κρατάς διάφορες version από τα έγγραφα, βάζοντας στο filename τους ένα timestamp.&lt;br /&gt;
&lt;br /&gt;
Aν όλα πάνε καλά, κάνεις "τρέχον" στη βάση το αρχείο που δημιουργήθηκε από το transaction και αλλάζεις το προηγούμενο με το συγκεκριμένο timestamp που έγινε η αλλαγή. Έτσι δεν θα χρειαστείς αλλαγές και σε τυχόν άλλες εφαρμογές που βλέπουνε το "τρέχον". Επίσης καλό θα είναι να κρατάς τα παλιά για κάθε ενδεχόμενο.&lt;br /&gt;
&lt;br /&gt;
Άν κάτι πάει στραβά, κάνεις "τρέχον" - χωρίς timestamp εκείνο με το timestamp του transaction, αντικαθιστώντας το νέο που απέτυχε.&lt;br /&gt;
&lt;br /&gt;
Έτσι μεταφέρεις το όλο πρόβλημα του rollback στη βάση.&lt;br /&gt;
&lt;br /&gt;
Για να μη γεμίσεις σαβούρα μπορείς να φτιάξεις και ένα scheduled task ή service που να σβήνει τα αρχεία που είναι παλιότερα από πχ 1 εβδομάδα</description></item><item><title>Απ: ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18317.aspx</link><pubDate>Tue, 10 Oct 2006 00:53:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18317</guid><dc:creator>Mitsaras</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18317.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18317</wfw:commentRss><description>Με ενδιαφέρει κι εμένα το ζήτημα αυτό, καθώς ακολουθώ την ίδια ακριβώς λύση (έχω βάλει κι ακόμα ένα layer, σε περίπτωση που αποτύχει το rollback).</description></item><item><title>ACID και Διαχείριση Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18316.aspx</link><pubDate>Tue, 10 Oct 2006 00:37:53 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18316</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18316.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=18316</wfw:commentRss><description>&lt;P&gt;Έχω να λύσω ένα θέμα το οποίο λίγο-πολύ όλοι το έχουμε συναντήσει. Έχω μερικούς αλγορίθμους και κάνουν κάποιους υπολογισμούς και διάφορα τέτοια και στο μεταξύ :&lt;/P&gt;
&lt;P&gt;α) επεμβένουν σε μια βάση δεδομένων&lt;BR&gt;β) δημιουργούν/διαγράφουν και μεταφέρουν κάποια αρχεία στο δίσκο.&lt;/P&gt;
&lt;P&gt;Για λόγους backward compatibility με συνεργαζόμενα υποσυστήματα&amp;nbsp;δεν μπορώ να αποφύγω κάτι από αυτά.&lt;/P&gt;
&lt;P&gt;Το πρόβλημα είναι, όπως εύκολα καταλαβαίνει κανείς, πως μπορούν να διασφαλιστούν τις αρχές του &lt;A href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/A&gt; (Atomicity, Consistency, Isolation, and Durability)&lt;STRONG&gt; &lt;/STRONG&gt;σε όλη αυτή τη διαδικασία. Για τις εργασίες στη βάση δεδομένων τα πράγματα είναι σχετικά απλά. Ξεκινώντας ένα transaction και κάνοντας rollback/commit θεωρώ ότι είμαι καλυμένος, για τις ανάγκες της συγκεκριμένης περίπτωσης. Τι γίνεται όμως με τη δημιουργία/διαγραφή/μεταφορά/αντικατάσταση αρχείων στο μεταξύ.&lt;/P&gt;
&lt;P&gt;Καταρχήν δέχομαι ότι απόλυτη λύση δεν υπάρχει. Απλά θέλω να κάνω ότι μπορώ για να εξασφαλίσω τα βασικά. Οπότε σκέφτηκα τα εξής:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Τα αρχεία που είναι να δημιουργηθούν, δημιουργούνται προσωρινά σε άλλη θέση. 
&lt;LI&gt;Τα αρχεία που είναι να διαγραφούν, μπαίνουν σε ένα collection (τα ονόματά τους). 
&lt;LI&gt;Τα αρχεία που είναι να τροποποιηθούν, αντιγράφονται σε προσωρινή θέση και τροποποιούνται εκεί.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Στο τέλος της διαδιασίας, πριν το "Commit Transaction" στην βάση δεδομένων αντιγράφω τα αρχεία από την προσωρινή θέση στην τελική τους και σβήνω αυτά που υπάρχουν στο collection διαγραφής. Μετά από όλα αυτά εκτελώ και το "Commit Transaction" στην βάση. Για λόγους απλότητας επιβάλω διαγραφή ακόμα και αν τα αρχεία είναι readonly. &lt;/P&gt;
&lt;P&gt;Προχωρόντας ένα βήμα πιο περα, σε περίπτωση προβλήματος, μπορώ να κάνω rollback στα αρχεία διαγράφοντας αυτά που δημιούργησα, επαναφέροντας αυτά που έσβησα ή αντικατέστησα (φυσικά θα πρέπει να έχω κρατήσει κάπου όλα αυτά).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Μπορείτε σας παρακαλώ να μου παραθέσετε τις απόψεις σας;&lt;/STRONG&gt;&lt;/P&gt;</description></item></channel></rss>