<?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>Web Services</title><link>https://www.dotnetzone.gr:443/cs/forums/21/ShowForum.aspx</link><description>Συζήτηση περί των web services και WSE, την υλοποίησή τους με το .NET Framework, καθώς και θέματα interoperability με άλλα συστήματα</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41602.aspx</link><pubDate>Fri, 18 Apr 2008 00:52:28 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41602</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41602.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41602</wfw:commentRss><description>&lt;P&gt;Χμμμμ.... αρχικά θα πρέπει να επιλέξεις έναν μηχανισμό για το data access layer. DataSets; Linq to SQL; NHibernate; Από αυτό θα εξαρτηθεί και το πώς θα γίνεται το change tracking. Κατόπιν, ανάλογα με τον μηχανισμό θα πρέπει να γίνει το "πάντρεμα" με το web service.&lt;/P&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41601.aspx</link><pubDate>Fri, 18 Apr 2008 00:35:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41601</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41601.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41601</wfw:commentRss><description>Κάποια πρόταση?&lt;br&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41529.aspx</link><pubDate>Tue, 15 Apr 2008 22:30:54 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41529</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41529.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41529</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;KelMan:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;
&lt;li&gt;Γιατί κάνεις εσύ τον έλεγχο για τον αν θα πρέπει να γίνει τελικά insert ή update; Οποιοδήποτε descent DAL (ξεκινώντας άκόμη και από τα απλά DataSets)&amp;nbsp;μπορεί να το κάνει αυτό για σένα και μάλιστα με πολύ πιο κομψό τρόπο. &lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Μπορείς να μου εξηγήσεις πώς γίνεται αυτό ή να μου δώσεις κάτι να διαβάσω πάνω σε αυτό για να το καταλάβω καλύτερα?&lt;/p&gt;Η αρχική ιδέα ήταν να μη χρησιμοποιήσω ευκολίες του .net ώστε να μπορώ να μεταφέρω πιο εύκολα το service σε άλλη γλώσσα αν χρειαστεί.&lt;br&gt;&lt;br&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;KelMan:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Αν για το " INSERT IF NOT EXISTS ()..." εννοείς τη λογική "if not
exists (select * from ... where&amp;nbsp;...)&amp;nbsp;insert into ..." τότε ναι,
απαιτείται transaction αλλά όχι απαραίτητα σε Serializable isolation
level. Σκέψου μόνο το εξής: στο Serializable κλειδώνουν οι εγγραφές
ενός πίνακα ακόμα και με το SELECT. Οπότε τελικά καταλήγεις σε πολύ
un-scalable σύστημα. &lt;/li&gt;&lt;li&gt;Το isolation level δεν το επιλέγουμε βάσει του πόσο περίπλοκα
πράγματα κάνουμε κάθε φορά που μιλάμε με τη βάση. Το επιλέγουμε&amp;nbsp;βάσει
του τι conflicts περιμένουμε να έχουμε με τους άλλους χρήστες που
κάνουν access τη βάση. Πολλές φορές ξεκινάμε από "light" isolation
level και με monitoring της συμπεριφοράς του server, ανάλογα αν
χρειάζεται, ανεβαίνουμε level. &lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/li&gt;&lt;/ul&gt;
Ναι, εγώ θεώρησα ότι αυτό είναι το σωστότερο μια και σε περίπτωση που δύο χρήστες προσπαθήσουν να εισάγουν την ίδια εγγραφή θα υπάρξει σημαντικό πρόβλημα στη βάση και μετά θα πρέπει να επέμβω χειροκίνητα. Οπότε αποφάσισα ότι καλύτερα να μην είναι για κάποια δέκατα του δευτερολέπτου ανοιχτή η βάση παρά να συμβαίνουν τέτοια φαινόμενα.&lt;br&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41526.aspx</link><pubDate>Tue, 15 Apr 2008 21:29:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41526</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41526.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41526</wfw:commentRss><description>&lt;P&gt;Χμμμ... Γι αυτό είπα ότι θα πρέπει να προδιορίσεις τί προσπαθείς να κάνεις σε conceptual level, αλλιώς κουβεντιάζουμε γενικά και αόριστα. &lt;/P&gt;
&lt;P&gt;Όπως και να έχει, μερικές παρατηρήσεις με βάση αυτά που λες:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Γιατί κάνεις εσύ τον έλεγχο για τον αν θα πρέπει να γίνει τελικά insert ή update; Οποιοδήποτε descent DAL (ξεκινώντας άκόμη και από τα απλά DataSets)&amp;nbsp;μπορεί να το κάνει αυτό για σένα και μάλιστα με πολύ πιο κομψό τρόπο.&lt;/LI&gt;
&lt;LI&gt;Αν για το " INSERT IF NOT EXISTS ()..." εννοείς τη λογική "if not exists (select * from ... where&amp;nbsp;...)&amp;nbsp;insert into ..." τότε ναι, απαιτείται transaction αλλά όχι απαραίτητα σε Serializable isolation level. Σκέψου μόνο το εξής: στο Serializable κλειδώνουν οι εγγραφές ενός πίνακα ακόμα και με το SELECT. Οπότε τελικά καταλήγεις σε πολύ un-scalable σύστημα. &lt;/LI&gt;
&lt;LI&gt;Το isolation level δεν το επιλέγουμε βάσει του πόσο περίπλοκα πράγματα κάνουμε κάθε φορά που μιλάμε με τη βάση. Το επιλέγουμε&amp;nbsp;βάσει του τι conflicts περιμένουμε να έχουμε με τους άλλους χρήστες που κάνουν access τη βάση. Πολλές φορές ξεκινάμε από "light" isolation level και με monitoring της συμπεριφοράς του server, ανάλογα αν χρειάζεται, ανεβαίνουμε level.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41524.aspx</link><pubDate>Tue, 15 Apr 2008 19:24:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41524</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41524.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41524</wfw:commentRss><description>Όχι, δεν είναι τόσο απλός ο κώδικας ώστε να περνιούνται μόνο απλές εγγραφές.&lt;br&gt;&lt;br&gt;Κάθε φορά ελέγχονται περίπου 7 πίνακες οι οποίοι συνδέονται μεταξύ τους με διάφορα Foreign Keys, σχετικά με το αν υπάρχει η εγγραφή, και τα διαφορα θυγατρικά της δεδομένα. Σε περίπτωση που δεν υπάρχει προστίθεται, αλλιώς γίνεται απλά UPDATE. &lt;br&gt;&lt;br&gt;Χωρίς Transaction, φοβάμαι ότι θα προκληθεί σημαντικό πρόβλημα. Ήδη μεταξύ 2 πινάκων με σχέση 1-1 έτυχε να ακυρωθεί η μία εντολή και μετά έπρεπε να σβήσω τη συγκεκριμένη εγγραφή χειροκίνητα γιατί σε αντίθετη περίπτωση δεν μπορούσε να βρει αυτή που υποτίθεται ότι υπήρχε.&lt;br&gt;&lt;br&gt;Εξάλλου, για τους ελέγχους χρησιμοποιώ INSERT IF NOT EXISTS ()... για το οποίο νομίζω είναι απαραίτητο το SERIALIZABLE.&lt;br&gt;&lt;br&gt;Γιαυτό προτιμώ να είναι και μεμονωμένα τα Transactions και όχι σε όλο τον βρόγχο, ώστε να δεσμεύουν τη βάση όσο λιγότερο γίνεται.&lt;br&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41523.aspx</link><pubDate>Tue, 15 Apr 2008 19:14:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41523</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41523.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41523</wfw:commentRss><description>&lt;P&gt;Το Serializable isolation level είναι αρκετά βαρύ καθώς είναι το πιο αυστηρό και δεν χρησιμοποιείται συχνά. Μάλιστα, όταν κάνεις insert και update με serializable, κλειδώνει ΟΛΟΚΛΗΡΟΣ ο πίνακας, πράγμα που συνεπάγεται τρομερό resource utilization. Τι ακριβώς θες να κάνεις; Γιατί το επέλεξες;&amp;nbsp;Τι προβλήματα θεωρείς ότι σου λύνει;&amp;nbsp;Απ' όσο έχω δει, αν απλά θες να περάσεις μερικές εγγραφές στη βάση είναι τρομερό overkill.&amp;nbsp;Εφόσον λες ότι δεν υπάρχει σημανικό πρόβλημα αν δεν περαστεί&amp;nbsp;κάποια εγγραφή,&amp;nbsp;δεν χρεάζεσαι&amp;nbsp;καν transaction!&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Μου φαίνεται θα πρέπει να μας περιγράψεις τι προσπαθείς να κάνεις σε conceptual επίπεδο.&amp;nbsp;Μπορεί τελικά να μην χρειάζεσαι transactions...&lt;/P&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41522.aspx</link><pubDate>Tue, 15 Apr 2008 19:01:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41522</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41522.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41522</wfw:commentRss><description>Μέχρι τώρα αυτό το είχα στα StoredProcedures που είχα φτιάξει για τη βάση. Δηλαδή:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;CREATE&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;PROCEDURE&lt;/span&gt; AddPerson&lt;br&gt;...&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;AS&lt;/span&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;SET&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;TRANSACTION&lt;/span&gt; ISOLATION LEVEL SERIALIZABLE&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;BEGIN&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;TRANSACTION&lt;/span&gt;&lt;br&gt;&lt;br&gt;....&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;COMMIT&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;TRANSACTION&lt;/span&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;RETURN&lt;/span&gt;&lt;br&gt;GO&lt;br&gt;&lt;br&gt;&lt;font face="Verdana" size="2"&gt;Οπότε τώρα σκέφτομαι να το βγάλω μεμονωμένα από κάθε Stored Procedure, και να το βάλω μέσω του .net κάθε φορά που τα καλώ, όπως παραπάνω. Πάντα στον server.&lt;br&gt;&lt;br&gt;Είναι καλύτερα δηλαδή να ξεκινώ τα Transactions μέσω του Framework ή να είναι ενσωματωμένα στα Procedures?&lt;br&gt;&lt;br&gt;&lt;br&gt;Υ.Γ. Προτιμώ να βρίσκεται μέσα στον βρόγχο και όχι απέξω, επειδή στη συγκεκριμένη υλοποίηση δεν υπάρχει σημαντικό πρόβλημα αν δεν περαστεί μία εγγραφή.&lt;/font&gt;&lt;br&gt;&lt;/span&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41519.aspx</link><pubDate>Tue, 15 Apr 2008 17:00:38 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41519</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41519.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41519</wfw:commentRss><description>&lt;p&gt;Φαντάζομαι ότι εννοείς να το κάνεις αυτό στον server. Καταρχήν θα βάλεις το BeginTransaction πριν το For Each και το Commit μετά το Next. Για την ακρίβεια πρέπει να το κάνεις, αν στην ίδια κλήση προς τον server κάνεις περισσότερα από ένα πράγματα προς τη βάση (π.χ. πολλά inserts).&lt;br&gt;&lt;/p&gt;&lt;p&gt;Αν εννοείς στον client, φυσικά όχι. Το transactions έχει να κάνει με την βάση και πρέπει να γίνει στον server. Στον client δεν πρέπει να υπάρχουν Connection objects και άλλα τέτοια.&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41514.aspx</link><pubDate>Tue, 15 Apr 2008 10:33:54 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41514</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41514.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41514</wfw:commentRss><description>Εντάξει, το έκανα έτσι και δεν υπάρχει προς το παρόν πρόβλημα. Η βελτίωση από πλευράς απόδοσης είναι επίσης σημαντική!&lt;br&gt;&lt;br&gt;Για να αποφύγω περίεργες συμπεριφορές, είχα τα Stored Procedures μου να περιέχουν Transaction εσωτερικά. &lt;br&gt;&lt;br&gt;Σκέφτομαι μήπως θα ήταν καλύτερο να βγάλω όλα τα Transactions από τον κώδικα των SPs, και να κάνω ένα Transaction για κάθε εισαγωγή, σε κάθε επανάληψη:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;        msConn.Open()&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;For&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Each&lt;/span&gt; prsn &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Person &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;In&lt;/span&gt; Persons&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trnNew &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; msConn.BeginTransaction&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Upload(prsn)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; trnNew.Commit()&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch&lt;/span&gt; ex &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; SqlException&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; trnNew.Rollback()&lt;br&gt;                &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox&lt;/span&gt;(ex.Message.ToString)&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Try&lt;/span&gt;&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Next&lt;/span&gt;&lt;br&gt;        msConn.Close()&lt;/span&gt;&lt;br&gt;&lt;br&gt;Πιστεύετε ότι θα είναι πιο σωστό?&lt;br&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41494.aspx</link><pubDate>Mon, 14 Apr 2008 07:21:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41494</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41494.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41494</wfw:commentRss><description>&lt;P&gt;Αντί να έχεις το loop στον client και να καλείς το web service πολλαπλές φορές (όπου προφανώς ξεκινάει το insert, κλειδώνει εγγραφές και πριν προλλάβει να τελειώσει, ανοίγει εκ νέου connection και προσπαθεί να ξανακάνει insert πάνω στα κλειδωμένα), πέρνα όλα μαζί τα Person instances και κάνε το loop&amp;nbsp;στον server. Με αυτόν τον τρόπο, πέρα του ότι θα λύσεις το πρόβλημα, θα&amp;nbsp;έχεις και πιο efficient&amp;nbsp;κώδικα αφού&amp;nbsp;θα κάνεις μόνο ένα web method call (πράγμα που κοστίζει) και δεν θα ανοιγοκλείνεις το connection στη βάση (πράγμα που επίσης κοστίζει).&lt;/P&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41492.aspx</link><pubDate>Mon, 14 Apr 2008 07:13:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41492</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41492.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41492</wfw:commentRss><description>&lt;p&gt;Είναι πολύ καλή επιλογή να καλέσεις το service σου ασύγχρονα για να δώσεις καλύτερη αίσθηση και έλεγχο στον τελικό χρήστη. Αν όμως έχεις πολλά Person instances να στείλεις τότε δεν είναι και τόσο αποδοτική η λύση. Επειδή η αποθήκευση ενός person είναι αρκετά ελαφρυά δουλειά, θα μπορούσες να περνάς ένα array από Person στο service σου για να μειώσεις τα threads και το overhead των κλήσεων. Το array θα μπορούσε να έχει όλα τα Person objects ή ομάδες αυτών (π.χ. 30 persons μαζί).&lt;br&gt;&lt;/p&gt;&lt;p&gt;Κατά τα άλλα, σχετικά με το μήνυμα που παίρνεις, ο sql server κλειδώνει τον πίνακα κατά το update, by default. Και επειδή καλείς πολλές φορές τον server και αυτός κάνει πολλές αποθηκεύσεις ταυτόχρονα τον μπουκώνεις λίγο. Διάβασε εδώ λίγο για το πως λειτουργούν τα locks όταν κάνεις update και δες στο τέλος του άρθρου τις εναλλακτικές έχεις.&lt;/p&gt;&lt;p&gt;&lt;a href="http://articles.techrepublic.com.com/5100-6329_11-5181472.html" target="_blank"&gt;http://articles.techrepublic.com.com/5100-6329_11-5181472.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41491.aspx</link><pubDate>Mon, 14 Apr 2008 07:00:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41491</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41491.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41491</wfw:commentRss><description>OK. Λοιπόν έχουμε:&lt;br&gt;&lt;br&gt;Client:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; btnStart_Click(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; System.&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Object&lt;/span&gt;, &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Handles&lt;/span&gt; btnStart.Click&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartTransmission()&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; Service &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;New&lt;/span&gt; DBService&lt;br&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; StartTransmission()&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Each&lt;/span&gt; entry &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Person &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;In&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Me&lt;/span&gt;.Persons&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Dim&lt;/span&gt; Result &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; IAsyncResult &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Service.BeginUpload(entry, &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;AddressOf&lt;/span&gt; Responder, entry)&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/span&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Responder(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; Result &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; IAsyncResult)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Service.EndUpload(Result)&lt;br&gt;&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If&lt;/span&gt; (InvokeRequired) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Invoke(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;New&lt;/span&gt; MyDelegate(&lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;AddressOf&lt;/span&gt; test), &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;New&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Object&lt;/span&gt;() {&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;CType&lt;/span&gt;(Result.AsyncState, Person)})&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Delegate&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; MyDelegate(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; prsn &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Person)&lt;br&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; test(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; prsn &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Person)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Uploaded: "&lt;/span&gt; &amp;amp; prsn.Name)&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Web Service:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;    &amp;lt;WebMethod(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Description&lt;/span&gt;:=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Upload a new entry"&lt;/span&gt;)&amp;gt; _&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Function&lt;/span&gt; Upload(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; prsn &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Person) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Boolean&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim&lt;/span&gt; msConn &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;New&lt;/span&gt; SqlConnection(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Data Source=.\SQLEXPRESS;Initial Catalog=addressbook;Integrated Security=True;"&lt;/span&gt;)&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim&lt;/span&gt; myCmd &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; SqlCommand&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;New&lt;/span&gt; SqlCommand(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"AddPerson"&lt;/span&gt;, msConn)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd.CommandType &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; CommandType.StoredProcedure&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd.Parameters.&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Add&lt;/span&gt;(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"@Name"&lt;/span&gt;, SqlDbType.NVarChar).Value &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; prsn.Name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd.Connection.Open()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd.ExecuteNonQuery()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCmd.Connection.Close()&lt;/span&gt;&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;True&lt;/span&gt;&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Και συγκεκριμένα πετάει αυτό, μετά από λίγη ώρα:&lt;br&gt;&lt;br&gt;&lt;font color="#000000"&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;System.Web.Services.Protocols.SoapException: Server was unable &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;to&lt;/span&gt; process &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;request&lt;/span&gt;. ---&amp;gt; System.Data.SqlClient.SqlException: Transaction (Process ID 56) was deadlocked on lock resources &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;with&lt;/span&gt; another process &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;and&lt;/span&gt; has been chosen &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;as&lt;/span&gt; the deadlock victim.&lt;/span&gt;&lt;/font&gt;&lt;br&gt;</description></item><item><title>Απ: Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41489.aspx</link><pubDate>Mon, 14 Apr 2008 06:43:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41489</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41489.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41489</wfw:commentRss><description>Χωρίς να δούμε κώδικα είναι λίγο δύσκολο να βοηθήσουμε. Δεν κατάλαβα πως μπλέκεται το ασύγχρονο με το For Each.</description></item><item><title>Asynchronous κλήση Web Service &amp; SQL Deadlock</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/41488.aspx</link><pubDate>Mon, 14 Apr 2008 06:36:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41488</guid><dc:creator>JohnL</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/41488.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=21&amp;PostID=41488</wfw:commentRss><description>Έχω φτιάξει ένα web service method το οποίο δέχεται ως input μία νέα καταχώρηση για τον SQL Server, και την περνάει στη βάση μέσω stored procedures.&lt;br&gt;&lt;br&gt;Προσπάθησα να το καλέσω ασύγχρονα, ώστε να μην κολλάει το κυρίως πρόγραμμα όσο γίνεται η διαδικασία, όμως επειδή αυτό στέλνει με For... Each πολλές εγγραφές, σε κάποιο σημείο μου πετάει Exception ότι ο SQL Server εντόπισε deadlock και επέλεξε να σταματήσει τη συγκεκριμένη transaction.&lt;br&gt;&lt;br&gt;Πώς μπορώ να το ξεπεράσω αυτό?&lt;br&gt;</description></item></channel></rss>