spring事物的特性浑槽、傳播機(jī)制蒋失、分類

看到關(guān)于spring事物比較好的兩篇文章,轉(zhuǎn)載過來桐玻。

1.事務(wù)的定義:事務(wù)是指多個操作單元組成的合集篙挽,多個單元操作是整體不可分割的,要么都操作不成功镊靴,要么都成功铣卡。其必須遵循四個原則(ACID)。

  1. 原子性(Atomicity):即事務(wù)是不可分割的最小工作單元偏竟,事務(wù)內(nèi)的操作要么全做煮落,要么全不做;
  2. 一致性(Consistency):在事務(wù)執(zhí)行前數(shù)據(jù)庫的數(shù)據(jù)處于正確的狀態(tài)踊谋,而事務(wù)執(zhí)行完成后數(shù)據(jù)庫的數(shù)據(jù)還是應(yīng)該處于正確的狀態(tài)蝉仇,即數(shù)據(jù)完整性約束沒有被破壞;如銀行轉(zhuǎn)帳褪子,A轉(zhuǎn)帳給B量淌,必須保證A的錢一定轉(zhuǎn)給B,一定不會出現(xiàn)A的錢轉(zhuǎn)了但B沒收到嫌褪,否則數(shù)據(jù)庫的數(shù)據(jù)就處于不一致(不正確)的狀態(tài)呀枢。
  3. 隔離性(Isolation):并發(fā)事務(wù)執(zhí)行之間互不影響,在一個事務(wù)內(nèi)部的操作對其他事務(wù)是不產(chǎn)生影響笼痛,這需要事務(wù)隔離級別來指定隔離性裙秋;
  4. 持久性(Durability):事務(wù)一旦執(zhí)行成功,它對數(shù)據(jù)庫的數(shù)據(jù)的改變必須是永久的缨伊,不會因比如遇到系統(tǒng)故障或斷電造成數(shù)據(jù)不一致或丟失摘刑。

2.事務(wù)的類型

  1. 數(shù)據(jù)庫分為本地事務(wù)跟全局事務(wù)
    • 本地事務(wù):普通事務(wù),獨(dú)立一個數(shù)據(jù)庫刻坊,能保證在該數(shù)據(jù)庫上操作的ACID枷恕。
    • 分布式事務(wù):涉及兩個或多個數(shù)據(jù)庫源的事務(wù),即跨越多臺同類或異類數(shù)據(jù)庫的事務(wù)(由每臺數(shù)據(jù)庫的本地事務(wù)組成的)谭胚,分布式事務(wù)旨在保證這些本地事務(wù)的所有操作的ACID徐块,使事務(wù)可以跨越多臺數(shù)據(jù)庫未玻;
  2. Java事務(wù)類型分為JDBC事務(wù)跟JTA事務(wù)
    • JDBC事務(wù):即為上面說的數(shù)據(jù)庫事務(wù)中的本地事務(wù),通過connection對象控制管理胡控。
    • JTA事務(wù):JTA指Java事務(wù)API(Java Transaction API)扳剿,是Java EE數(shù)據(jù)庫事務(wù)規(guī)范, JTA只提供了事務(wù)管理接口昼激,由應(yīng)用程序服務(wù)器廠商(如WebSphere Application Server)提供實(shí)現(xiàn)庇绽,JTA事務(wù)比JDBC更強(qiáng)大,支持分布式事務(wù)橙困。
  3. 按是否通過編程分為聲明式事務(wù)和編程式事務(wù)瞧掺,參考http://blog.csdn.net/liaohaojian/article/details/70139151
    • 聲明式事務(wù):通過XML配置或者注解實(shí)現(xiàn)。
    • 編程式事務(wù):通過編程代碼在業(yè)務(wù)邏輯時需要時自行實(shí)現(xiàn)纷宇,粒度更小夸盟。

3.Spring事務(wù)隔離級別:spring有五大隔離級別,其在TransactionDefinition接口中定義像捶∩仙拢看源碼可知,其默isolation_default(底層數(shù)據(jù)庫默認(rèn)級別)拓春,其他四個隔離級別跟數(shù)據(jù)庫隔離級別一致释簿。

  1. ISOLATION_DEFAULT:用底層數(shù)據(jù)庫的默認(rèn)隔離級別,數(shù)據(jù)庫管理員設(shè)置什么就是什么
  2. ISOLATION_READ_UNCOMMITTED(未提交讀):最低隔離級別硼莽、事務(wù)未提交前庶溶,就可被其他事務(wù)讀取(會出現(xiàn)幻讀懂鸵、臟讀偏螺、不可重復(fù)讀)
  3. ISOLATION_READ_COMMITTED(提交讀):一個事務(wù)提交后才能被其他事務(wù)讀取到(該隔離級別禁止其他事務(wù)讀取到未提交事務(wù)的數(shù)據(jù)、所以還是會造成幻讀匆光、不可重復(fù)讀)套像、sql server默認(rèn)級別
  4. ISOLATION_REPEATABLE_READ(可重復(fù)讀):可重復(fù)讀,保證多次讀取同一個數(shù)據(jù)時终息,其值都和事務(wù)開始時候的內(nèi)容是一致夺巩,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(該隔離基本可防止臟讀,不可重復(fù)讀(重點(diǎn)在修改)周崭,但會出現(xiàn)幻讀(重點(diǎn)在增加與刪除))(MySql默認(rèn)級別柳譬,更改可通過set transaction isolation level 級別)
  5. ISOLATION_SERIALIZABLE(序列化):代價最高最可靠的隔離級別(該隔離級別能防止臟讀、不可重復(fù)讀续镇、幻讀)
    1. 丟失更新:兩個事務(wù)同時更新一行數(shù)據(jù)美澳,最后一個事務(wù)的更新會覆蓋掉第一個事務(wù)的更新,從而導(dǎo)致第一個事務(wù)更新的數(shù)據(jù)丟失,這是由于沒有加鎖造成的人柿;
    2. 幻讀:同樣的事務(wù)操作過程中柴墩,不同時間段多次(不同事務(wù))讀取同一數(shù)據(jù)忙厌,讀取到的內(nèi)容不一致(一般是行數(shù)變多或變少)凫岖。
    3. 臟讀:一個事務(wù)讀取到另外一個未提及事務(wù)的內(nèi)容,即為臟讀逢净。
    4. 不可重復(fù)讀:同一事務(wù)中哥放,多次讀取內(nèi)容不一致(一般行數(shù)不變,而內(nèi)容變了)爹土。

幻讀與不可重復(fù)讀的區(qū)別:幻讀的重點(diǎn)在于插入與刪除甥雕,即第二次查詢會發(fā)現(xiàn)比第一次查詢數(shù)據(jù)變少或者變多了,以至于給人一種幻象一樣胀茵,而不可重復(fù)讀重點(diǎn)在于修改社露,即第二次查詢會發(fā)現(xiàn)查詢結(jié)果比第一次查詢結(jié)果不一致,即第一次結(jié)果已經(jīng)不可重現(xiàn)了琼娘。

數(shù)據(jù)庫隔離級別越高峭弟,執(zhí)行代價越高,并發(fā)執(zhí)行能力越差脱拼,因此在實(shí)際項(xiàng)目開發(fā)使用時要綜合考慮瞒瘸,為了考慮并發(fā)性能一般使用提交讀隔離級別,它能避免丟失更新和臟讀熄浓,盡管不可重復(fù)讀和幻讀不能避免情臭,但可以在可能出現(xiàn)的場合使用悲觀鎖或樂觀鎖來解決這些問題。

悲觀鎖與樂觀鎖可參考:http://blog.csdn.net/liaohaojian/article/details/62416972

4.傳播行為:有七大傳播行為赌蔑,也是在TransactionDefinition接口中定義俯在。

  1. PROPAGATION_REQUIRED:支持當(dāng)前事務(wù),如當(dāng)前沒有事務(wù)娃惯,則新建一個跷乐。

  2. PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如當(dāng)前沒有事務(wù)石景,則已非事務(wù)性執(zhí)行(源碼中提示有個注意點(diǎn)劈猿,看不太明白,留待后面考究)潮孽。

  3. PROPAGATION_MANDATORY:支持當(dāng)前事務(wù)揪荣,如當(dāng)前沒有事務(wù),則拋出異常(強(qiáng)制一定要在一個已經(jīng)存在的事務(wù)中執(zhí)行往史,業(yè)務(wù)方法不可獨(dú)自發(fā)起自己的事務(wù))仗颈。

  4. PROPAGATION_REQUIRES_NEW:始終新建一個事務(wù),如當(dāng)前原來有事務(wù),則把原事務(wù)掛起挨决。

  5. PROPAGATION_NOT_SUPPORTED:不支持當(dāng)前事務(wù)请祖,始終已非事務(wù)性方式執(zhí)行,如當(dāng)前事務(wù)存在脖祈,掛起該事務(wù)肆捕。

  6. PROPAGATION_NEVER:不支持當(dāng)前事務(wù);如果當(dāng)前事務(wù)存在盖高,則引發(fā)異常慎陵。

  7. PROPAGATION_NESTED:如果當(dāng)前事務(wù)存在,則在嵌套事務(wù)中執(zhí)行喻奥,如果當(dāng)前沒有事務(wù)席纽,則執(zhí)行與 PROPAGATION_REQUIRED 類似的操作(注意:當(dāng)應(yīng)用到JDBC時,只適用JDBC 3.0以上驅(qū)動)撞蚕。

5.Spring事務(wù)支持

1.spring提供了很多內(nèi)置事務(wù)管理器润梯,支持不同數(shù)據(jù)源。常見的有三大類

  • DataSourceTransactionManager:org.springframework.jdbc.datasource包下甥厦,數(shù)據(jù)源事務(wù)管理類纺铭,提供對單個javax.sql.DataSource數(shù)據(jù)源的事務(wù)管理,只要用于JDBC矫渔,Mybatis框架事務(wù)管理彤蔽。

  • HibernateTransactionManager:org.springframework.orm.hibernate3包下,數(shù)據(jù)源事務(wù)管理類庙洼,提供對單個org.hibernate.SessionFactory事務(wù)支持顿痪,用于集成Hibernate框架時的事務(wù)管理;注意:該事務(wù)管理器只支持Hibernate3+版本油够,且Spring3.0+版本只支持Hibernate 3.2+版本蚁袭;

  • JtaTransactionManager:位于org.springframework.transaction.jta包中,提供對分布式事務(wù)管理的支持石咬,并將事務(wù)管理委托給Java EE應(yīng)用服務(wù)器揩悄,或者自定義一個本地JTA事務(wù)管理器,嵌套到應(yīng)用程序中鬼悠。

內(nèi)置事務(wù)管理器都繼承了抽象類AbstractPlatformTransactionManager删性,而AbstractPlatformTransactionManager又繼承了接口PlatformTransactionManager

Spring框架支持事務(wù)管理的核心是事務(wù)管理器抽象,對于不同的數(shù)據(jù)訪問框架通過實(shí)現(xiàn)策略接口PlatformTransactionManager焕窝,從而能支持多鐘數(shù)據(jù)訪問框架的事務(wù)管理蹬挺。

PlatformTransactionManager接口定義如下

 public interface PlatformTransactionManager {
        //返回一個已經(jīng)激活的事務(wù)或創(chuàng)建一個新的事務(wù)(具體由TransactionDefinition參數(shù)定義的事務(wù)屬性決定),
        // 返回的TransactionStatus對象代表了當(dāng)前事務(wù)的狀態(tài)它掂,
        // 其中該方法拋出TransactionException(未檢查異常)表示事務(wù)由于某種原因失敗巴帮。
        TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
        //用于提交TransactionStatus參數(shù)代表的事務(wù)。
        void commit(TransactionStatus status) throws TransactionException;
        //用于回滾TransactionStatus參數(shù)代表的事務(wù)。
        void rollback(TransactionStatus status) throws TransactionException;
    }

TransactionDefinition接口定義如下:

public interface TransactionDefinition {        
        int getPropagationBehavior();  //返回定義的事務(wù)傳播行為       
        int getIsolationLevel(); //返回事務(wù)隔離級別       
        int getTimeout();  //返回定義的事務(wù)超時時間       
        boolean isReadOnly();  //返回定義的事務(wù)是否是只讀的       
        String getName();  //返回事務(wù)名稱
         } 

TransactionStatus接口定義如下:

public interface TransactionStatus extends SavepointManager {
       boolean isNewTransaction();  //返回當(dāng)前事務(wù)是否是新的事務(wù)
       boolean hasSavepoint();  //返回當(dāng)前事務(wù)是否有保存點(diǎn)
       void setRollbackOnly();  //設(shè)置事務(wù)回滾
       boolean isRollbackOnly();  //設(shè)置當(dāng)前事務(wù)是否應(yīng)該回滾
       //用于刷新底層會話中的修改到數(shù)據(jù)庫榕茧,一般用于刷新如Hibernate/JPA的會話垃沦,
       // 可能對如JDBC類型的事務(wù)無任何影響;
       void flush();  
       boolean isCompleted();  //返回事務(wù)是否完成

   }

2.Spring分布式事務(wù)配置

  • 引用應(yīng)用服務(wù)器(如Tomcat)的JNDI數(shù)據(jù)源用押,間接實(shí)現(xiàn)JTA事務(wù)管理肢簿,依賴于應(yīng)用服務(wù)器
  • 直接集成JOTM(官網(wǎng):http://jotm.objectweb.org/)、Atomikos(官網(wǎng):https://www.atomikos.com/)提供JTA事務(wù)管理(無應(yīng)用服務(wù)器支持只恨,常用于單元測試)
  • 使用特定于應(yīng)用服務(wù)器的事務(wù)管理器译仗,使用JTA事務(wù)的高級功能(Weblogic,Websphere)

1).引用應(yīng)用服務(wù)器(如Tomcat)的JNDI數(shù)據(jù)源官觅,間接實(shí)現(xiàn)JTA事務(wù)管理,配置如下

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jee="http://www.springframework.org/schema/jee"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/jee
   http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<!-- JNDI數(shù)據(jù)源 -->
 <jee:jndi-lookup id="dataSource" jndi-name="jdbc/test"/>
   <!-- JTA事務(wù)管理器  -->
   <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
       <!--transactionManagerName指定JTA事務(wù)管理器的JNDI名字阐污,
       從而將事務(wù)管理委托給該事務(wù)管理器  -->
       <property name="transactionManagerName" value="java:comp/TransactionManager"/>
   </bean>
</beans>

2)使用Atomikos實(shí)現(xiàn)分布式事務(wù)管理休涤,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"   
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    >
     
    <context:component-scan base-package="com.suicai.*.service.impl" />
    <context:component-scan base-package="com.suicai.util" />
    <!-- 此方法加載的配置文件僅僅在xml中使用,但是工具類都采用注解的方式 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:conn.properties" />
    </bean>
    <!-- 僅僅支持注解不支持在xml配置中使用properties文件  在類中可以使用SPEL表達(dá)式來加載相應(yīng)的值 -->
    <bean id="temp" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <array>
                <value>classpath:public.properties</value>
            </array>
        </property>
    </bean>
    <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"  destroy-method="close" abstract="true"> 
        <property name="borrowConnectionTimeout" value="60"/>  <!--獲取連接失敗重新獲等待最大時間,在這個時間內(nèi)如果有可用連接笛辟,將返回-->
        <property name="reapTimeout" value="20"/> <!--最大獲取數(shù)據(jù)時間功氨,如果不設(shè)置這個值,Atomikos使用默認(rèn)的5分鐘手幢,那么在處理大批量數(shù)據(jù)讀取的時候捷凄,一旦超過5分鐘,就會拋出類似 Resultset is close 的錯誤.-->        
        <property name="maintenanceInterval" value="60" />  <!--連接回收時間-->    
        <property name="loginTimeout" value="60" />     <!--java數(shù)據(jù)庫連接池围来,最大可等待獲取datasouce的時間-->
        <property name="logWriter" value="60"/>
        <property name="minPoolSize" value="1" />  <!-- 連接池中保留的最小連接數(shù)   -->
        <property name="maxPoolSize" value="3" />  <!-- 連接池中保留的最大連接數(shù)    -->
        <property name="maxIdleTime" value="60" /> <!-- 最大空閑時間,60秒內(nèi)未使用則連接被丟棄跺涤。若為0則永不丟棄。Default: 0 -->
    </bean> 
     <!-- 配置2個數(shù)據(jù)源 mysql -->
     <bean id="ds_suicai" parent="abstractXADataSource">  
        <!-- uniqueResourceName表示唯一資源名监透,如有多個數(shù)據(jù)源不可重復(fù)桶错; -->
        <property name="uniqueResourceName" value="suicaifortest" />
        <!--  xaDataSourceClassName是具體分布式數(shù)據(jù)源廠商實(shí)現(xiàn); -->
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
        <!-- xaProperties屬性指定具體廠商數(shù)據(jù)庫屬性 -->
        <property name="xaProperties">
            <props>
                <prop key="URL">${db.jdbcUrlOne}</prop>
                <prop key="user">${user}</prop>
                <prop key="password">${password}</prop>
            </props>
        </property>
    </bean>  
    <bean id="ds_kaizhi"  parent="abstractXADataSource">  
        <!-- uniqueResourceName表示唯一資源名胀蛮,如有多個數(shù)據(jù)源不可重復(fù)院刁; -->
        <property name="uniqueResourceName" value="puildingpurchasefortest" />
        <!-- xaDataSourceClassName是具體分布式數(shù)據(jù)源廠商實(shí)現(xiàn); -->
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
        <!-- xaProperties屬性指定具體廠商數(shù)據(jù)庫屬性 -->
        <property name="xaProperties">
            <props>
                <prop key="URL">${db.jdbcUrlTwo}</prop>
                <prop key="user">${user}</prop>
                <prop key="password">${password}</prop>
            </props>
        </property>
    </bean>  
    <!-- 動態(tài)配置數(shù)據(jù)源 --> 
    <bean id="dataSource2" class="com.suicai.common.datasource.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type ="java.lang.String">  
                <entry value-ref ="ds_suicai" key="ds_suicai"></entry >  
                <entry value-ref ="ds_kaizhi" key="ds_kaizhi"></entry >  
            </map > 
        </property>  
        <property name ="defaultTargetDataSource" ref="ds_suicai"></property>  
    </bean>
    
   
    <bean id ="sqlSessionFactoryBeanA" class="org.mybatis.spring.SqlSessionFactoryBean" >  
       <!-- 指定數(shù)據(jù)源 -->  
       <property name ="dataSource" ref="ds_suicai" />  
       <!-- 指定mybatis 的配置文件 -->  
       <property name ="configLocation" value="classpath:mybatis.cfg.xml" />  
    </bean>
    
    <bean id ="sqlSessionFactoryBeanB" class="org.mybatis.spring.SqlSessionFactoryBean" >  
       <!-- 指定數(shù)據(jù)源 -->  
       <property name ="dataSource" ref="ds_kaizhi" />  
       <!-- 指定mybatis 的配置文件 -->  
       <property name ="configLocation" value="classpath:mybatis.cfg.xml" />  
    </bean>
    <!--CustomSqlSessionTemplate繼承SqlSessionTemplate重寫getSqlSessionFactory方法粪狼,具體請下載查看--> 
    <bean id="sqlSessionTemplate" class="com.suicai.util.CustomSqlSessionTemplate" scope="prototype">
        <constructor-arg ref="sqlSessionFactoryBeanA" />
        <property name="targetSqlSessionFactorys">
            <map>     
                <entry value-ref ="sqlSessionFactoryBeanA" key="ds_suicai1"></entry >  
                <entry value-ref ="sqlSessionFactoryBeanB" key="ds_kaizhi1"></entry >  
            </map> 
        </property>
    </bean>  
    
    <!-- 配置atomikos事務(wù)管理器 -->
    <bean id="atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method = "close">    
          <property name="forceShutdown" value="true"/>    
    </bean>    
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"></bean>
    <!-- 配置spring事務(wù)管理器 -->
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">    
        <property name="transactionManager">    
            <ref bean="atomikosTransactionManager"/>    
        </property>    
        <property name="userTransaction">    
            <ref bean="atomikosUserTransaction"/>    
        </property> 
        <!-- 必須設(shè)置退腥,否則程序出現(xiàn)異常 JtaTransactionManager does not support custom isolation levels by default -->
        <property name="allowCustomIsolationLevels" value="true"/>    
    </bean>
    
    <tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- REQUIRED:必須要有事務(wù), 如果沒有就在上下文創(chuàng)建一個 -->
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="creat*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <!-- 支持,如果有就有,沒有就沒有 -->
            <tx:method name="*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut expression="execution(* com.suicai.*.service.impl.*.*(..))" id="pointcut"/>
        <!-- 吧 tx與aop的配置關(guān)聯(lián),才是完整的聲明事務(wù)配置 -->
        <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
    </aop:config>
    <!-- 采用包掃描機(jī)制,自動會把指定的包里面的所有dao注冊 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注意注入sqlSessionTemplate -->
        <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
        <property name="basePackage" value="com.suicai.*.dao" />
    </bean>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
        <!--jsp存放的目錄-->
        <property name="prefix">
            <value>/</value>
        </property>
        <!--jsp文件的后綴-->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
    <!-- 驗(yàn)證碼 -->
    <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
        <property name="config">  
            <bean class="com.google.code.kaptcha.util.Config">  
                <constructor-arg>  
                    <props>  
                        <prop key="kaptcha.border">no</prop>  
                        <prop key="kaptcha.border.color">105,179,90</prop>  
                        <prop key="kaptcha.textproducer.font.color">red</prop>  
                        <prop key="kaptcha.image.width">200</prop>  
                        <prop key="kaptcha.textproducer.font.size">60</prop>  
                        <prop key="kaptcha.image.height">80</prop>  
                        <prop key="kaptcha.session.key">code</prop>  
                        <prop key="kaptcha.textproducer.char.length">4</prop>  
                        <prop key="kaptcha.textproducer.font.names">宋體,楷體,微軟雅黑</prop>  
                    </props>  
                </constructor-arg>  
            </bean>  
        </property>  
    </bean>
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:messages"/>  
        <property name="fileEncodings" value="utf-8"/>  
        <property name="cacheSeconds" value="120"/>  
    </bean>
</beans>

atomikos所需包及相關(guān)配置文件下載路徑:http://download.csdn.net/detail/liaohaojian/9813868,其中文件jta.properties文件放到classpath根目錄下再榄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狡刘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子不跟,更是在濱河造成了極大的恐慌颓帝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異购城,居然都是意外死亡吕座,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門瘪板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吴趴,“玉大人,你說我怎么就攤上這事侮攀÷嘀Γ” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵兰英,是天一觀的道長撇叁。 經(jīng)常有香客問我,道長畦贸,這世上最難降的妖魔是什么陨闹? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮薄坏,結(jié)果婚禮上趋厉,老公的妹妹穿的比我還像新娘。我一直安慰自己胶坠,他們只是感情好君账,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沈善,像睡著了一般乡数。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矮瘟,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天瞳脓,我揣著相機(jī)與錄音,去河邊找鬼澈侠。 笑死劫侧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哨啃。 我是一名探鬼主播烧栋,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拳球!你這毒婦竟也來了审姓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤祝峻,失蹤者是張志新(化名)和其女友劉穎魔吐,沒想到半個月后扎筒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酬姆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年嗜桌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辞色。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡骨宠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出相满,到底是詐尸還是另有隱情层亿,我是刑警寧澤吮螺,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布绊谭,位于F島的核電站,受9級特大地震影響塘秦,放射性物質(zhì)發(fā)生泄漏悯辙。R本人自食惡果不足惜琳省,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躲撰。 院中可真熱鬧,春花似錦击费、人聲如沸拢蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆棱。三九已至,卻和暖如春圆仔,著一層夾襖步出監(jiān)牢的瞬間垃瞧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工坪郭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留个从,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓歪沃,卻偏偏與公主長得像嗦锐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沪曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 很多人喜歡這篇文章奕污,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,747評論 2 59
  • 事物特性 ⑴原子性(Atomicity) 原子性是指事務(wù)包含的所有操作要么全部成功液走,要么全部失敗回滾碳默,因此事務(wù)的操...
    HJJ_3c00閱讀 271評論 0 0
  • Spring 事務(wù)屬性分析 事務(wù)管理對于企業(yè)應(yīng)用而言至關(guān)重要贾陷。它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的...
    壹點(diǎn)零閱讀 1,306評論 0 2
  • 事務(wù) 回顧知識 1嘱根、什么是事務(wù) 事務(wù)邏輯上的一組操作,組成這組操作的各個邏輯單元,要么一起成功,要么一起失敗. 2...
    guan_xy閱讀 258評論 0 0
  • 在這兩天髓废,有很多事情發(fā)生。比如說孫雨湘過生日讓我去儿子,但是白浩宇也在那天過生日瓦哎。雖然我最后去的是白浩宇生日,但是我一...
    陳騰芬4閱讀 354評論 0 0