IBATIS事務處理

2021-07-24 19:17:04 字數 4343 閱讀 4569

ibatis事務處理是和dao緊密相聯的。

在使用dao時,如以下**,先插入新記錄,再進行更新:

userdao.insertuser (user); // starts transaction 

user.setname("wh"); 

userdao.updateuser (user); // starts a new transaction

因為沒有顯式地啟動事務,ibatis會認為這是兩次事務,分別從連線池中取兩次connection。

我們所寫的dao子類(繼承自com.ibatis.dao.client.template.sqlmapdaotemplate)的每乙個dao方法已經預設為乙個事務(通過動態**)。

這樣的事務是隱式事務.

ibatis是通過daomanager類來統管dao子類的事務,

眾dao子類由daomanager產生,如下:

reader reader =resources.getresourceasreader("dao.xml"); 

daomanager  daomanager =daomanagerbuilder.builddaomanager(reader); 

userdao userdao = (userdao) daomanager.getdao(userdao.class);

userdao是使用者自己定義的介面,獲得的其實是在dao.xml中指定的相對應的 sqlmapdao實現類,從而實現了松藕合。在良好的分層設計中,

但是一般的事務需要放到業務層,因為乙個業務需要具有原子性,事務放到dao層是不能達到業務一致的效果的,那麼如果想要把事務放到業務層,就需要在業務層使用顯示事務進行宣告處理.

顯式地宣告事務處理語句,如下:

try finally

這樣就保持了原子性,整體為乙個事務,要麼全部執行成功,否則回滾。

現在唯一的問題就是,dao層的事務是否已經放棄,否則產生事務巢狀問題對效能會有影響.

當然,ibatis 完全可以這麼做:建乙個宣告式介面:iservice,再使用動態**,將使用者自己的serivce子類通過動態**自動包上事務處理的**,預設每乙個業務方法為乙個事務。

大師的心如果能輕易揣測,就是不大師了:),估計大師認為這樣屬於過度設計,他認為把這種靈活**給使用者是合適的,相當多的service 方法只呼叫乙個dao方法,例如crud操作。

再補充一下,ibatis中對事務的處理是可配置的,最常用的type是"jdbc",也可以宣告為"jta"或"external".

專案裡常用spring與ibatis配合使用,這樣可以在spring裡配置事務管理,可以省去業務層的顯示事務**.

spring的配置檔案的基本寫法為:

<?

xmlversion

="1.0"

encoding

="utf-8"

?>

<

beansxmlns

beansxmlns

=""xmlns

:xsi

=""xmlns:aop

=""xmlns

:tx=

""xmlns:context

=""xsi:schemalocation

="    

/spring-beans-2.0.xsd  

/spring-aop-2.0.xsd    

/spring-tx-2.0.xsd">

<

bean

id="datasource"

class

="org.apache.commons.dbcp.basicdatasource" 

>

<

property

name

="driverclassname"

value

="com.mysql.jdbc.driver" 

/>

<

property

name

="url"

value

="jdbc:mysql:

characterencoding

=gb2312

"/>

<

property

name

="username"

value

="dev01"

/>

<

property

name

="password"

value

="123456"

/>

bean

>

<

bean

id="sqlclient"

class

="org.springframework.orm.ibatis.sqlmapclientfactorybean"

>

<

property

name

="datasource"

>

<

reflocal

="datasource"

/>

property

>

<

property

name

="configlocation"

>

<

value

>

classpath:sqlmaps.xml

value

>

property

>

bean

>

<

beanid=

"transactionmanager"

class

="org.springframework.jdbc.datasource.datasourcetransactionmanager"

>

<

propertyname

propertyname

="datasource"

ref=

"datasource"

>

property

>

bean

>

<

tx:advice

id="serviceadvice"

transaction

-manager

="transactionmanager"

>

<

tx:attributes

>

<

tx:methodname

tx:methodname

="insert*"

propagation

="required"

rollback

-for

="throwable"

/>

<

tx:methodname

tx:methodname

="del*"

propagation

="required"

rollback

-for

="throwable"

/>

<

tx:methodname

tx:methodname

="update*"

propagation

="required"

rollback

-for

="throwable"

/>

<

tx:methodname

tx:methodname

="*"

read-only

="true"

/>

tx:attributes

>

tx:advice

>

<

aop:config

proxy-target-class

="true"

>

<

aop:pointcut

id="servicepointcut"

expression

="execution(* com.wh.service.*.*(..))"

/>

<

aop:advisor

pointcut-ref

="servicepointcut"

advice

-ref

="serviceadvice"

/>

aop:config

>

這是在spring+ibatis的情況下, ,通過aop控制需要事務的包和具體方法,將事務控制在service層,來達到事務在業務層提交和回滾.保持業務的原子性.

PB事務處理

1 資料視窗更新,只要dberror有錯誤,而事先沒有做過任何commit工作,那麼rollback可以回滾到上次commit位置,即上次commit後所有的資料將被回滾。2 如果是直接寫入sql語句,只要資料庫出現錯誤,那麼rollback可以回滾到上次commit的位置,即上次commit後所有...

MySQL事務處理

start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...

ASP事務處理

asp事務處理。測試資料庫為sql server,伺服器為本機,資料庫名為test,表名為a,兩個欄位id int 主鍵標識,num int set conn server.createobject adodb.connection strconn provider sqloledb.1 persi...