1. 程式人生 > >SpringMVC+ibatis資料庫事務控制

SpringMVC+ibatis資料庫事務控制

由於在系統中使用了關聯表,邏輯上是關聯的,實際資料庫並沒有做外來鍵。就需要寫大量的資料庫事務操作。之前一直沒有比較好的方式,直接在dao層侵入的方式進行,雖然該方式可以實現事務的管理,但是總覺得有些問題。實現方式如下:

    public int insert(ChuxinRecord t) {
        SqlMapClient sqlMapClient = getWriteTemplate().getSqlMapClient();
        try {
            sqlMapClient.startTransaction();
            sqlMapClient.getCurrentConnection
().setAutoCommit(false); Object obj = sqlMapClient.insert("chuxin_record.insertEntry",t); //更新頻道資訊 ChuxinChannel channel = new ChuxinChannel(); channel.setId(t.getChannelId()); // channel.setRecordNum(channel.getRecordNum()==null?1:(channel.getRecordNum
()+1)); sqlMapClient.update("chuxin_channel.updateEntryByKey", channel); sqlMapClient.update("chuxin_channel.addOneRecord", t.getChannelId()); //更新未讀訊息數量 sqlMapClient.update("chuxin_user_channel.addOneRecordNum", t.getChannelId()); sqlMapClient.commitTransaction
(); sqlMapClient.getCurrentConnection().commit(); if (null!=obj) { return (Integer)obj; } return 0; } catch (Exception e) { logger.error("執行錯誤", e); try { sqlMapClient.getCurrentConnection().rollback(); } catch (SQLException e1) { logger.error("事物回滾錯誤", e); } } finally { try { sqlMapClient.endTransaction(); if (null != sqlMapClient.getCurrentConnection()) { sqlMapClient.getCurrentConnection().close(); } } catch (SQLException e) { logger.error("關閉事物錯誤", e); } } return 0; }

從以上程式碼可以看出我們通過顯示的方式進行控制,這樣很多邏輯就會寫在dao層,邏輯複雜,實用性不強。
那麼什麼是更好的方式那?利用切面的方式控制。

1. 在ctx-dao.xml 檔案中配置切面

<!--配置哪些方法,什麼情況下需要回滾-->  
    <tx:advice id="serviceAdvice" transaction-manager="transactionManager">   
        <tx:attributes>
            <!--當代理的service層中的方法丟擲異常的時候才回滾,必須加rollback-for引數-->  
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>  
            <tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>   
            <tx:method name="update*" propagation="REQUIRED" rollback-for="Throwable"/>   
            <tx:method name="tran*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>   
            <!--除了上面標識的方法,其他方法全是隻讀方法-->  
            <tx:method name="*" read-only="true"/>   
        </tx:attributes>   
    </tx:advice>   
    <!-- 配置哪些類的方法需要進行事務管理 -->   
    <aop:config proxy-target-class="true">   
        <aop:pointcut id="servicePointcut" expression="execution(* com.hdd.service.impl.*.*(..))"/>   
        <aop:advisor pointcut-ref="servicePointcut" advice-ref="serviceAdvice"/>   
    </aop:config>  

我們定義了需要測試的方式為tran*開頭的方法

 <tx:method name="tran*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/> 

觀察在定義中有句:

rollback-for="java.lang.RuntionException"

該句話非常關鍵,會涉及到是否會回滾事務。之前配置很多一直沒有注意這點,所以每次測試的時候事務總錯誤,並沒有回滾。
在介面中定義方法:

void tranTest();

方法實現:

@Override
    public void tranTest() {
        try {
            HddAd hddAd = new HddAd();
            hddAd.setAbContent("123456");
            hddAdDao.insert(hddAd);

            Feedback feedback = new Feedback();
            feedback.setContactInfo("wwwwwwwwwwwww");
            feedbackDao.insert(feedback);

        } catch (Exception e) {
            logger.error("會回滾嗎",e);
            throw new RuntimeException(e);
        }
    }

feedback類的contactInfo屬性為8位,在插入過程中肯定會報錯。而HddAd類是可以插入成功的。觀察,當出現異常的時候,我們會丟擲異常RuntimeException

throw new RuntimeException(e);

這行程式碼非常關鍵,剛好為我們之前在tx定義的rollback-for,這也是觸發事務回滾的關鍵點。
編寫測試類,測試錯誤時候是否回滾:

public class Insert {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("ctx-web.xml");

        HddAdService hddAdService = (HddAdService)ctx.getBean("hddAdService");
        hddAdService.tranTest();

    }
}

好了,執行觀察事務是否回滾了。

關於tx相關配置,網上有太多說明,我就不逐個解釋了,重點是讓他可以順利的實現預期功能,這是實用主義者的信條。

參考文件:

相關推薦

SpringMVC+ibatis資料庫事務控制

由於在系統中使用了關聯表,邏輯上是關聯的,實際資料庫並沒有做外來鍵。就需要寫大量的資料庫事務操作。之前一直沒有比較好的方式,直接在dao層侵入的方式進行,雖然該方式可以實現事務的管理,但是總覺得有些問題。實現方式如下: public int ins

設定資料庫事務控制的問題

在進行對資料庫儲存這方面程式碼編寫時如果是分段執行需要注意如果過程中發生錯誤而沒有新增事務控制的話就會發生一、髒讀    指一個執行緒中的事務讀取到了另外一個執行緒中未提交的資料二、不可重複讀    指一個執行緒中的事務讀取到了另外一個執行緒中提交的UPDATE資料三、虛度 

資料庫中的事務控制語句

1、提交事務(commit) 說明:把物件資料庫的修改操作,真實在底層執行,只有提交事務以後,資料才真實存在 create table emp( id number(4) name varchar2(20) ); 首先表插入資料: insert into emp values(1,'his');

SpringMVC與Mybatis集合實現呼叫儲存過程、事務控制

在SSM框架中經常會用到呼叫資料庫中的儲存過程、以及事務控制,下面以儲存某單據為例,介紹一下: 1、Oracle中儲存過程程式碼如下(主要邏輯將單據編碼自動加1,並將該單據編碼返回): CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT"

spirngMVC如何在專案中列印異常日誌+springmvc事務控制詳解

首先 service層的增、刪、改操作前要加註解@Transactonal,如下   @Transactional public void saveErpProductType(ErpProduc

配置跨資料庫事務控制

1 匯入包   2 配置XML檔案   <?xml version="1.0"encoding="UTF-8"?> <web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"   

Oracle資料庫中資料操作和事務控制以及鎖

表資料的操作(DML):     插入:     修改:     刪除:     合併:大資料操作的時候,資料倉庫      插入:使用values只能插入一行資料     插入空值:         1)不寫         2)插入空串         3)null

Spring 的官方的事務控制

commit back zab cep actor repr 等待時間 exce 相同 Spring 官方版的事務控制 什麽是事務? 事務是數據庫(RDB)保證業務操作完整性的一種機制(強一致性) 事務在那裏控制 業務層控制(Service 或Biz 或Busine

spring boot集成mybatis+事務控制

package 數據源 action cti ase conn span hand enc 一下代碼為DEMO演示,采用註解的方式完成Spring boot和Mybatis的集成,並進行事物的控制 數據源的配置: 1 spring.datasource.url=jdbc:

StackExchange.Redis學習筆記(四) 事務控制和Batch批量操作

成了 pan arp 展示 關於 public 連續 因此 用戶 Redis事物 Redis命令實現事務 Redis的事物包含在multi和exec(執行)或者discard(回滾)命令中 和sql事務不同的是,Redis調用Exec只是將所有的命令變成一個單元一起執行,期

數據庫 之 事務控制和隔離級別

可能 處理 eas 獨立 ble space 銷毀 實現 rac 1 概述事務是指一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工作單元;MyISAM不流行的原因很大是因為其不支持事務的處理功能。2 事務日誌事務日誌定義屬性,有些參數可以運行時修改,寫入在

spring中編程式事務控制

intra ans res ren nbsp new temp class 進行 step1:配置xml文件 1 <!-- 事務管理bean --> 2 <bean id="transactionManager" class="org.sprin

(5)DML增強功能-try catch及事務控制

code sys 之間 server recommend sel 因此 視圖 數據庫連接 一、事務控制與Try Catch結合 BEGIN TRY   BEGIN TRAN;     DECLARE @aaa NVARCHAR(MAX);     SET @aaa =

多數據源動態配置及事務控制

業務 data 實例 每一個 RM join 數據 個數 lis 1、動態數據源切換時,如何保證事務   目前事務最靈活的方式,是使用spring的聲明式事務,本質是利用了spring的aop,在執行數據庫操作前後,加上事務處理。   spring的事務管理,是基於數據源的

事務控制語句

true lse one 原子 事務控制 轉賬 失敗 兩個 img 語法 commit; 提交(確認操作,寫到硬盤上) rollback; 回滾(回退) savepoint; 保存點名 rollback to ; 回滾(回退)到某個點 事務的四大特性 t

Spring事務控制和回滾

get not 拋出異常 tle 配置 set checked 事務配置 攔截器 1在一個項目中ssh結構,spring2.5,事務控制采用的是tx攔截器的方式。 自己寫了個 int a=1/0;異常拋出了,但是事務還是提交了,怎麽搞都不行。 現將看到的一些事務控制總結下來

Spring的事務控制

配置文件 color 名稱空間 隔離級別 16px 介紹 driver cti 指令 一、事務的概念   事務是一組操作的執行單元,相對於數據庫操作來講,事務管理的是一組SQL指令,比如增加,修改,刪除等,事務的一致性,要求,這個事務內的操作必須全部執行成功,如果在此過程種

MySQL的事務控制(二)

1. MySQL 通過 SET AUTOCOMMIT,START TRANSACTION ,COMMIT ,ROLLBACK 等語句支援本地事務。 2. 語法格式: START TRANSACTION  | BEGIN [WORK] COMMIT [WORK]  &n

MySQL的事務控制和鎖定語句

1.  預設情況下 ,表鎖和行鎖都是自動獲得的,不需要額外命令。 2.  某些情況下,使用者需要明確地進行鎖表或者進行事務的控制,以便確保整個事務的完整性。 3. LOCK  TABLES  可以鎖定用於當前執行緒的表。如果表被其他執行緒鎖定,則當前執

資料庫-事務處理的概念和理論簡介

在看這一部分內容之前,我對資料庫一些基礎概念和基礎操作的認識十分淺薄,也沒有一些資料庫管理的經驗,因此當學這一部分的時候遇到了賊多理解上的誤區和困難。難受呀,基礎差真的不行。。。但是我已經沒有時間先從頭仔細學習資料庫基礎再學這一部分了,因此只能在泥濘中前行。即使在本文結束之前,好多概念我