﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Sun River-随笔分类-Spring</title><link>http://www.blogjava.net/SunRiver/category/17335.html</link><description>Topics about Java EE, XML,AJAX,SOA,OSGi,DB, .NET etc.</description><language>zh-cn</language><lastBuildDate>Tue, 04 Dec 2007 14:45:18 GMT</lastBuildDate><pubDate>Tue, 04 Dec 2007 14:45:18 GMT</pubDate><ttl>60</ttl><item><title>Spring Transaction Management</title><link>http://www.blogjava.net/SunRiver/archive/2007/12/01/164500.html</link><dc:creator>Sun River</dc:creator><author>Sun River</author><pubDate>Sat, 01 Dec 2007 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/SunRiver/archive/2007/12/01/164500.html</guid><description><![CDATA[&nbsp;
<p style="margin-left: 12pt; text-indent: -12pt; line-height: 18pt; tab-stops: list 12.0pt">1.&nbsp;<span style="font-size: 9pt; color: black; font-family: Verdana">How someone can define that a method should be execute inside read-only transaction semantics?</span></p>
<table style="margin-left: 3.35pt; width: 99.34%" cellpadding="0" width="99%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 3.48%; padding-top: 0.75pt" width="3%">
            <p style="line-height: 18pt"><span style="font-size: 9pt; font-family: Verdana">&nbsp; A</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: black; font-family: Verdana">It is not possible</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 3.48%; padding-top: 0.75pt" width="3%">
            <p style="line-height: 18pt"><span style="font-size: 9pt; font-family: Verdana">&nbsp; B</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: black; font-family: Verdana">No special action should be taken, default transaction semantics is read-only</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 3.48%; padding-top: 0.75pt" width="3%">
            <p style="line-height: 18pt"><span style="font-size: 9pt; font-family: Verdana">&nbsp; C</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: black; font-family: Verdana">It is possible using the following snippet:<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tx:method</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">"some-method"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">semantics</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">"read-only"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">/&gt;</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 3.48%; padding-top: 0.75pt" width="3%">
            <p style="line-height: 18pt"><span style="font-size: 9pt; font-family: Verdana">D</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: black; font-family: Verdana">It is possible using the following snippet:<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tx:method</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">"some-method"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">read-only</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">"true"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">/&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
            </td>
        </tr>
        <tr style="height: 58.5pt">
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 99.4%; padding-top: 0.75pt; height: 58.5pt" width="99%" colspan="2">
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: #6d6d6d; font-family: Verdana">explanation </span></p>
            <p style="line-height: 18pt"><span style="font-size: 9pt; color: black; font-family: Verdana">Default semantics in Spring is read/write, and someone should use </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">read-only </span><span style="font-size: 9pt; color: black; font-family: Verdana">attribute to define read-only semantics for the method. </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-left: 0.25in; text-indent: -0.25in; line-height: 18pt; tab-stops: list .25in">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: black; font-family: Verdana">What is the correct way to execute some code inside transaction using programmatic transaction management?</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; font-family: Verdana">&nbsp;A </span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Extend TransactionTemplate class and put all the code inside <em>execute()</em> method.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; font-family: Verdana">&nbsp; B</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Implement class containing business code inside the method. Inject this class into TransactionManager.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; font-family: Verdana">C</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Extend TransactionCallback class. Put all the code inside <em>doInTransaction()</em> method. Pass the object of created class as parameter to <em>transactionTemplate.execute()</em> method.&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; font-family: Verdana">&nbsp; D</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Extend TransactionCallback class. Put all the code inside <em>doInTransaction()</em> method. Create the instance of TransactionCallback, call <em>transactionCallback.doInTransaction</em> method and pass TransactionManager as a parameter.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="line-height: 18pt; tab-stops: 24.0pt">3.<span style="font-size: 9pt; color: black; font-family: Verdana"> Select all statements that are correct.</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Spring provides a consistent programming model across different transaction APIs such as JTA, JDBC, Hibernate, JPA, and JDO.</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">The Spring Framework supports declarative transaction management.</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Spring provides a simpler API for programmatic transaction management than a number of complex transaction APIs such as JTA.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 95%; padding-top: 0.75pt" width="95%">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">The transaction management integrates very well with Spring's various data access abstractions.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="line-height: 18pt; tab-stops: 24.0pt">4. <span style="font-size: 9pt; color: black; font-family: Verdana">Does this method guarantee that all of its invocations will process data with </span><code><span style="font-size: 10pt; color: black; font-family: 'Courier New'">ISOLATION_SERIALIZABLE</span></code><span style="font-size: 9pt; color: black; font-family: Verdana">?<br />
Assume </span><code><span style="font-size: 10pt; color: black; font-family: 'Courier New'">txManager</span></code><span style="font-size: 9pt; color: black; font-family: Verdana"> to be valid and only existing </span><code><span style="font-size: 10pt; color: black; font-family: 'Courier New'">PlatformTransactionManager</span></code><span style="font-size: 9pt; color: black; font-family: Verdana"> .<br />
</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">public</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">void</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> query</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">()</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">{</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DefaultTransactionDefinition txDef =newDefaultTransactionDefinition();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txDef.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txDef.setReadOnly(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionStatus txStat = txManager.getTransaction(txDef);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txManager.commit(txStat);<br />
}<br />
<br />
</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-size: 9pt; color: #6d6d6d; font-family: Verdana">explanation </span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">If this method executes within an existing transaction context, it's isolation level will reflect the existing isolation level. For example JDBC does not specify what happens when one tries to change isolation level during existing transaction. </span><code><span style="font-size: 10pt; color: black; font-family: 'Courier New'">PROPAGATION_REQUIRES_NEW</span></code><span style="font-size: 9pt; color: black; font-family: Verdana"> will assure that transaction isolation is set to serializable.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="line-height: 18pt; tab-stops: 24.0pt">5.<span style="font-size: 9pt; color: black; font-family: Verdana"> You would like to implement class with programmatic transaction management. <br />
How can you get TransactionTemplate instance?</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2.98%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">It is necessary to implement a certain interface in this class and then use <em>getTransactionTemplate()</em> call.</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">It is possible to declare TransactionTemplate object in configuration file and inject it in this class.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 96.12%; padding-top: 0.75pt" width="96%">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">It is possible to declare PlatformTransactionManager object in configuration file, inject the manager in this class and then create TransactionTemplate like<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">TransactionTemplate</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> transactionTemplate </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">new</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">TransactionTemplate</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">platformTransactionManager</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="line-height: 18pt; tab-stops: 24.0pt"><span style="font-size: 9pt; color: black; font-family: Verdana">It's possible to inject either <em>PlatformTransactionManager</em> or <em>TransactionTemplate</em> in this class.<br />
Option one is obviously wrong.</span></p>
<p style="line-height: 18pt; tab-stops: 24.0pt">6.<span style="font-size: 9pt; color: black; font-family: Verdana"> Check the correct default values for the @Transactional annotation.</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">PROPAGATION_REQUIRED</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">The isolation level defaults to the default level of the underlying transaction system.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 2%; padding-top: 0.75pt" width="2%">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">readOnly="true"</span></p>
            </td>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: medium none; padding-right: 0.75pt; border-top: medium none; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: medium none; padding-top: 0.75pt; border-bottom: #999999 0.75pt dotted">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">Only the Runtime Exceptions will trigger rollback.</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 95%; padding-top: 0.75pt" width="95%">
            <p><span style="font-size: 9pt; color: black; font-family: Verdana">The transaction timeout defaults to the default timeout of the underlying transaction system, or none if timeouts are not supported.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="line-height: 18pt; tab-stops: 24.0pt">7.<span style="font-size: 9pt; color: black; font-family: Verdana"> To make a method transactional in a concrete class it's enough to use <em>@Transactional</em> annotation before the method name (in Java &gt;=5.0).</span></p>
<p><span style="font-size: 9pt; color: #6d6d6d; font-family: Verdana">correct&nbsp;answer </span></p>
<p><span style="font-size: 9pt; color: red; font-family: Verdana">FALSE</span></p>
<p><span style="font-size: 9pt; color: #6d6d6d; font-family: Verdana">explanation </span></p>
<p style="line-height: 18pt; tab-stops: 24.0pt"><span style="font-size: 9pt; color: black; font-family: Verdana">No, <em>@Transactional</em> annotation only marks a method as transactional. To make it transactional it is necessary to include the <em>&lt;tx:annotation-driven/&gt;</em> element in XML configuration file.</span></p>
<span style="font-size: 12pt; font-family: 'Times New Roman'">8.</span><span style="font-size: 9pt; color: black; font-family: Verdana"> The JtaTransactionManager allows us to use distributed transactions. (t)</span>
<img src ="http://www.blogjava.net/SunRiver/aggbug/164500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SunRiver/" target="_blank">Sun River</a> 2007-12-01 15:20 <a href="http://www.blogjava.net/SunRiver/archive/2007/12/01/164500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>