<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 ## PlatformTransactionManager 此接口是 spring 的事務管理器,它里面提供了我們常用的操作事務的方法 ![](https://img.kancloud.cn/38/1a/381a108a882c99d44e69e6f55da2b325_659x317.png) 我們在開發中都是使用它的實現類 真正管理事務的對象 ~~~ org.springframework.jdbc.datasource.DataSourceTransactionManager 使用 Spring JDBC 或 iBatis 進行持久化數據時使用 org.springframework.orm.hibernate5.HibernateTransactionManager 使用 Hibernate 版本進行持久化數據時使用 ~~~ ## TransactionDefinition 它是事務的定義信息對象,里面有如下方法 ![](https://img.kancloud.cn/ee/d1/eed1acb278528c71d3e64b1a3edf2432_503x380.png) ## 事務的隔離級別 ![](https://img.kancloud.cn/0e/38/0e3895bf6928765886d0fdda6efe1c28_738x429.png) ## 事務傳播行為 * REQUIRED:如果當前沒 有事務,就 新建一個 事務,如果已經存在 一個事務 中,加入 到這個事務 中。一般 的選 擇(默認值) * SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行(沒有事務) * MANDATORY:使用當前的事務,如果當前沒有事務,就拋出異常 * REQUERS_NEW:新建事務,如果當前在事務中,把當前事務掛起。 * `NOT_SUPPORTED`:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起 * NEVER:以非事務方式運行,如果當前存在事務,拋出異常 * NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行 REQUIRED 類似的操作。 ## 超時時間 默認值是-1,沒有超時限制。 如果有,以秒為單位進行設置。 ## 是否是只讀事務 建議查詢時設置為只讀 ## TransactionStatus 此接口提供的是事務具體的運行狀態,方法介紹如下圖 ![](https://img.kancloud.cn/a1/de/a1de5aafdc547fae518b17f2d4700181_661x380.png) # xml 轉賬代碼要對他加事務 ~~~ public void transfer(String sourceName, String targeName, Float money) { //1.根據名稱查詢兩個賬戶 Account source = accountDao.findAccountByName(sourceName); Account target = accountDao.findAccountByName(targeName); //更新兩個賬戶 target.setMoney(target.getMoney() + money); source.setMoney(source.getMoney() - money); accountDao.updateAccount(source); //int i = 1 / 0; accountDao.updateAccount(target); } ~~~ xml中配置 ~~~ <!-- 配置數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:///app"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- spring中基于xml的聲明式事務控制配置步驟 1. 配置事務管理器 2. 配置事務的通知, 要導入約束 使用tx:advice配置事務通知 屬性: id 事務通知唯一標識 transaction-manager: 給事務通知提供一個事務管理器引用 3. 配置aop中通用切入點表達式 4. 建立事務通知和切入點表達式的對應關系 5. 配置事務的屬性 是在事務通知的tx:advice標簽的內部 --> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置事務通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 配置事務的屬性 isolation: 指定事務的隔離級別,默認值是DEFAULT,表示用數據庫的 no-rollback-for:指定一個異常,當產生該異常時,事務不回滾,產生其他異常時事務回滾.沒有默認值表示任何異常都回滾 propagation: 指定事務的傳播新聞,默認值是REQUIRED,表示一定會有事務.查詢可以選擇SUPPORTS read-only: 指定事務是否只讀,只有查詢方法才能設置true,默認false表示讀寫 rollback-for: 指定一個異常,當產生這個異常事務將回滾,其他異常事務不回滾.沒有默認值表示任何異常都回滾 timeout: 指定事務的超時時間 --> <tx:attributes> <tx:method name="*" propagation="REQUIRED" read-only="false" /> <!-- 下面優先級比上面高,find*方法 --> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置aop --> <aop:config> <!-- 切入點表達式 --> <aop:pointcut id="pt1" expression="execution(* com.jdxia.service.*.*(..))" /> <!-- 建立切入點表達式和事務的關系 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1" /> </aop:config> ~~~ # aop 類上加這個 ~~~ @Service("accountServiceImpl") //類上加上這個 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class AccountServiceImpl implements IAccountService { ~~~ 方法上加這個(如果和類不同的話) ~~~ //需要單獨配置事務 @Transactional(propagation = Propagation.REQUIRED, readOnly = false) @Override public void transfer(String sourceName, String targeName, Float money) { //1.根據名稱查詢兩個賬戶 Account source = accountDao.findAccountByName(sourceName); Account target = accountDao.findAccountByName(targeName); //2.修改兩個賬戶的金額 source.setMoney(source.getMoney()-money);//轉出賬戶減錢 target.setMoney(target.getMoney() + money);//轉入賬戶加錢 //3.更新兩個賬戶 source.setMoney(source.getMoney() - money); accountDao.updateAccount(source); //int i = 1 / 0; accountDao.updateAccount(target); } ~~~ ~~~ /** * @Transactional 可以標注的位置: * 類上 : 對類中的每個方法都起作用 * 方法上 : 只對當前的方法起作用 * 如果類上和方法上都加了該注解,方法上的優先. * * @Transactional 注解的屬性: * * 1. propagation 事務的傳播行為 事務是可以進行傳播的, 一個事務方法調用另一個事務方法時,會把當前方法的事務傳遞給被調用的方法. * 被調用的方法可以決定如何使用事務. * REQUIRED: 默認值, 使用調用者的事務. * REQUIRES_NEW: 將調用者的事務掛起,開啟新的事務來使用. * * 2. isolation 事務的隔離級別 * * 讀未提交 READ_UNCOMMITTED 1 臟讀 * 讀已提交 READ_COMMITTED 2 不可重復讀 * 可重復讀 REPEATABLE_READ 4 幻讀 * 串行化 SERIALIZABLE 8 效率低 * * * 3. timeout 事務的超時設置 事務在強制回滾之前可以占用的時間. * * 4. readOnly 事務的只讀設置 可以幫助數據庫引擎優化事務 * * 5. 事務的回滾與不回滾的設置 默認情況下,Spring會對所有的運行時異常進行回滾. * rollbackFor * rollbackForClassName * noRollbackFor * noRollbackForClassName */ @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, timeout=3,readOnly=false ,noRollbackFor= {UserAccountException.class}) ~~~ xml中 ~~~ <!-- aop掃描包 --> <context:component-scan base-package="com.jdxia" /> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- spring中基于注解的聲明式事務控制配置步驟 1. 配置事務管理器 2. 開啟spring對注解事務的支持 3. 在需要事務支持地方使用transactional注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> ~~~ # 編程式事務 直接在 ~~~ transactionTemplate.execute(new TransactionCallback<Object>() { ~~~ 這里面寫就行 ~~~ public void transfer(String sourceName, String targetName, Float money) { transactionTemplate.execute(new TransactionCallback<Object>() { @Override public Object doInTransaction(TransactionStatus status) { System.out.println("transfer...."); //2.1根據名稱查詢轉出賬戶 Account source = accountDao.findAccountByName(sourceName); //2.2根據名稱查詢轉入賬戶 Account target = accountDao.findAccountByName(targetName); //2.3轉出賬戶減錢 source.setMoney(source.getMoney()-money); //2.4轉入賬戶加錢 target.setMoney(target.getMoney()+money); //2.5更新轉出賬戶 accountDao.updateAccount(source); // int i=1/0; //2.6更新轉入賬戶 accountDao.updateAccount(target); return null; } }); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看