成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java事物處理代碼 java處理機(jī)制

如何用java開(kāi)啟mysql事務(wù),要求詳細(xì)

如何用java開(kāi)啟mysql事務(wù),要求詳細(xì)

成都創(chuàng)新互聯(lián)從2013年成立,先為定邊等服務(wù)建站,定邊等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為定邊企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

看你是什么事務(wù),jdbc事務(wù),還是分布式事務(wù),還是容器事務(wù)

1,編程式事務(wù)管理(jdbc的事務(wù)是綁定在connection上的)

Connection conn = null;

try

{

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");

conn.setAutoCommit(false); //取消自動(dòng)提交

PreparedStatement ps = conn.prepareCall("update something");

ResultSet rs = ps.executeQuery();

conn點(diǎn)抗 mit(); //手動(dòng)提交

}

catch (Exception e)

{

conn.rollback();

e.printStackTrace();

}

finally

{

conn.close();

}

2,聲明式事務(wù)

先在工程的application.xml配置文件中添加如下代碼,開(kāi)啟事務(wù)

!-- 聲明式事務(wù)控制配置 --

tx:annotation-driven transaction-manager="txManager"/

bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"

property name="datasource" ref="bassDataSource"/property

/bean

然后在你需要開(kāi)啟事務(wù)的接口前面添加注解

@Transactional(rollbackFor = IOException.class)

public void add(String name) throws IOException

{

System.out.println("可以再類(lèi)里和方法里面添加事務(wù)注解0~0");

throw new IOException();

}

直接調(diào)用接口方法就好

分布式事務(wù)處理(mysql貌似在5.X之后才支持) 的話(huà),

1.可以直接使用spring+atomikos框架進(jìn)行管理

參考:

就不貼測(cè)試代碼了,自己看著配置吧

2,使用JTA(Java Transaction API)進(jìn)行分布式事務(wù)管理(測(cè)試代碼如下)

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import javax.transaction.SystemException;

import javax.transaction.UserTransaction;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

//分布式事務(wù)處理

public class transferAccount

{

@SuppressWarnings("null")

public void testTransferAccount()

{

UserTransaction userts = null;

Connection connA = null;

PreparedStatement psA = null;

InitialContext context = null;

Connection connB = null;

PreparedStatement psB = null;

try

{

//獲得事務(wù)管理對(duì)象

userts = (UserTransaction) context.lookup("java:comp/UserTransaction");

//獲取兩個(gè)數(shù)據(jù)庫(kù)

connA = getDataSourceA().getConnection();

connB = getDataSourceB().getConnection();

//開(kāi)啟事務(wù)

userts.begin();

//sql語(yǔ)句

psA = connA.prepareStatement("我加1");

psB = connB.prepareStatement("我減1");

//執(zhí)行sql

psA.executeUpdate();

psB.executeUpdate();

//事務(wù)提交

userts點(diǎn)抗 mit();

} catch (Exception e)

{

try

{

userts.rollback();

} catch (IllegalStateException | SecurityException

| SystemException e1)

{

e1.printStackTrace();

}

e.printStackTrace();

}

finally

{

try

{

psA.close();

psB.close();

connA.close();

connB.close();

} catch (SQLException e)

{

e.printStackTrace();

}

}

}

public DataSource getDataSourceA()

{

MysqlDataSource dataSource = new MysqlDataSource();

dataSource.setDatabaseName("mysql");

dataSource.setServerName("server");

dataSource.setPortNumber(1433);

dataSource.setUser("test");

dataSource.setPassword("test");

return dataSource;

}

public DataSource getDataSourceB()

{

MysqlDataSource dataSource = new MysqlDataSource();

dataSource.setDatabaseName("mysql");

dataSource.setServerName("server");

dataSource.setPortNumber(1435);

dataSource.setUser("test1");

dataSource.setPassword("test1");

return dataSource;

}

}

JAVA設(shè)計(jì)模式之事務(wù)處理[1]

;???事務(wù)處理是企業(yè)應(yīng)用需要解決的最主要的問(wèn)題之一 J EE通過(guò)JTA提供了完整的事務(wù)管理能力 包括多個(gè)事務(wù)性資源的管理能力 但是大部分應(yīng)用都是運(yùn)行在單一的事務(wù)性資源之上(一個(gè)數(shù)據(jù)庫(kù)) 他們并不需要全局性的事務(wù)服務(wù) 本地事務(wù)服務(wù)已然足夠(比如JDBC事務(wù)管理) ??? 本文并不討論應(yīng)該采用何種事務(wù)處理方式 主要目的是討論如何更為優(yōu)雅地設(shè)計(jì)事務(wù)服務(wù) 僅以JDBC事務(wù)處理為例 涉及到的DAO Factory Proxy Decorator等模式概念 請(qǐng)閱讀相關(guān)資料 ??? 也許你聽(tīng)說(shuō)過(guò) 事務(wù)處理應(yīng)該做在service層 也許你也正這樣做 但是否知道為什么這樣做?為什么不放在DAO層做事務(wù)處理 顯而易見(jiàn)的原因是業(yè)務(wù)層接口的每一個(gè)方法有時(shí)候都是一個(gè)業(yè)務(wù)用例(User Case) 它需要調(diào)用不同的DAO對(duì)象來(lái)完成一個(gè)業(yè)務(wù)方法 比如簡(jiǎn)單地以網(wǎng)上書(shū)店購(gòu)書(shū)最后的確定定單為例 業(yè)務(wù)方法首先是調(diào)用BookDAO對(duì)象(一般是通過(guò)DAO工廠(chǎng)產(chǎn)生) BookDAO判斷是否還有庫(kù)存余量 取得該書(shū)的價(jià)格信息等 然后調(diào)用CustomerDAO從帳戶(hù)扣除相應(yīng)的費(fèi)用以及記錄信息 然后是其他服務(wù)(通知管理員等) 簡(jiǎn)化業(yè)務(wù)流程大概如此:??? 注意 我們的例子忽略了連接的處理 只要保證同一個(gè)線(xiàn)程內(nèi)取的是相同的連接即可(可用ThreadLocal實(shí)現(xiàn))

首先是業(yè)務(wù)接口 針對(duì)接口 而不是針對(duì)類(lèi)編程

public interface BookStoreManager{ ????????? public boolean buyBook(String bookId int quantity)throws SystemException; ????????? 其他業(yè)務(wù)方法 ??? }

接下來(lái)就是業(yè)務(wù)接口的實(shí)現(xiàn)類(lèi)??業(yè)務(wù)對(duì)象

public class BookStoreManagerImpl implements BookStoreManager{ ???????? public boolean buyBook(String bookId)throws SystemException{ ????????????? Connection conn=ConnectionManager getConnection();//獲取數(shù)據(jù)庫(kù)連接 ????????????? boolean b=false; ????????????? ????????????? try{ ????????????????? conn setAutoCommit(false);? //取消自動(dòng)提交 ????????????????? BookDAO bookDAO=DAOFactory getBookDAO(); ????????????????? CustomerDAO customerDAO=DAOFactory getCustomerDAO(); ??????????????????? //嘗試從庫(kù)存中取書(shū) ????????????????? if(BookDAO reduceInventory(conn bookId quantity)){ ?????????????????????? BigDecimal price=BookDAO getPrice(bookId);? //取價(jià)格 ?????????????????????? //從客戶(hù)帳戶(hù)中扣除price*quantity的費(fèi)用 ?????????????????????? b= ?????????????????????? CustomerDAO reduceAccount(conn price multiply(new BigDecimal(quantity)); ?????????????????????? ?????????????????????? 其他業(yè)務(wù)方法 如通知管理員 生成定單等 ??????????????????????? ?????????????????????? conn mit();?? //提交事務(wù) ?????????????????????? conn setAutoCommit(true); ????????????????? } ?????????????? }catch(SQLException e){ ????????????????? conn rollback();?? //出現(xiàn)異常 回滾事務(wù) ????????????????? con setAutoCommit(true); ????????????????? e printStackTrace(); ????????????????? throws new SystemException(e);?? ?????????????? } ?????????????? return b; ???????? } ??? }

然后是業(yè)務(wù)代表工廠(chǎng) ?

public final class ManagerFactory { ????? public static BookStoreManager getBookStoreManager() { ???????? return new BookStoreManagerImpl(); ????? } ?? }

這樣的設(shè)計(jì)非常適合于DAO中的簡(jiǎn)單活動(dòng) 我們項(xiàng)目中的一個(gè)小系統(tǒng)也是采用這樣的設(shè)計(jì)方案 但是它不適合于更大規(guī)模的應(yīng)用 首先 你有沒(méi)有聞到代碼重復(fù)的 bad *** ell?每次都要設(shè)置AutoCommit為false 然后提交 出現(xiàn)異常回滾 包裝異常拋到上層 寫(xiě)多了不煩才怪 那能不能消除呢?其次 業(yè)務(wù)代表對(duì)象現(xiàn)在知道它內(nèi)部事務(wù)管理的所有的細(xì)節(jié) 這與我們?cè)O(shè)計(jì)業(yè)務(wù)代表對(duì)象的初衷不符 對(duì)于業(yè)務(wù)代表對(duì)象來(lái)說(shuō) 了解一個(gè)與事務(wù)有關(guān)的業(yè)務(wù)約束是相當(dāng)恰當(dāng)?shù)?但是讓它負(fù)責(zé)來(lái)實(shí)現(xiàn)它們就不太恰當(dāng)了 再次 你是否想過(guò)嵌套業(yè)務(wù)對(duì)象的場(chǎng)景?業(yè)務(wù)代表對(duì)象之間的互相調(diào)用 層層嵌套 此時(shí)你又如何處理呢?你要知道按我們現(xiàn)在的方式 每個(gè)業(yè)務(wù)方法都處于各自獨(dú)立的事務(wù)上下文當(dāng)中(Transaction Context) 互相調(diào)用形成了嵌套事務(wù) 此時(shí)你又該如何處理?也許辦法就是重新寫(xiě)一遍 把不同的業(yè)務(wù)方法集中成一個(gè)巨無(wú)霸包裝在一個(gè)事務(wù)上下文中

我們有更為優(yōu)雅的設(shè)計(jì)來(lái)解決這類(lèi)問(wèn)題 如果我們把Transaction Context的控制交給一個(gè)被業(yè)務(wù)代表對(duì)象 DAO和其他Component所共知的外部對(duì)象 當(dāng)業(yè)務(wù)代表對(duì)象的某個(gè)方法需要事務(wù)管理時(shí) 它提示此外部對(duì)象它希望開(kāi)始一個(gè)事務(wù) 外部對(duì)象獲取一個(gè)連接并且開(kāi)始數(shù)據(jù)庫(kù)事務(wù) 也就是將事務(wù)控制從service層抽離 當(dāng)web層調(diào)用service層的某個(gè)業(yè)務(wù)代表對(duì)象時(shí) 返回的是一個(gè)經(jīng)過(guò)Transaction Context外部對(duì)象包裝(或者說(shuō)代理)的業(yè)務(wù)對(duì)象 此代理對(duì)象將請(qǐng)求發(fā)送給原始業(yè)務(wù)代表對(duì)象 但是對(duì)其中的業(yè)務(wù)方法進(jìn)行事務(wù)控制 那么 我們?nèi)绾螌?shí)現(xiàn)此效果呢?答案是JDK 引進(jìn)的動(dòng)態(tài)代理技術(shù) 動(dòng)態(tài)代理技術(shù)只能代理接口 這也是為什么我們需要業(yè)務(wù)接口BookStoreManager的原因 ??? 首先 我們引入這個(gè)Transaction Context外部對(duì)象 它的代碼其實(shí)很簡(jiǎn)單 如果不了解動(dòng)態(tài)代理技術(shù)的請(qǐng)先閱讀其他資料

lishixinzhi/Article/program/Java/gj/201311/27765

java事務(wù)處理

如果對(duì)數(shù)據(jù)庫(kù)進(jìn)行多次操作,每一次的執(zhí)行或步驟都是一個(gè)事務(wù).如果數(shù)據(jù)庫(kù)操作在某一步?jīng)]有執(zhí)行或出現(xiàn)異常而導(dǎo)致事務(wù)失敗,這樣有的事務(wù)被執(zhí)行有的就沒(méi)有被執(zhí)行,從而就有了事務(wù)的回滾,取消先前的操作.....

JavaBean中使用JDBC方式進(jìn)行事務(wù)處理

public int delete(int sID) {

  dbc = new DataBaseConnection();

  Connection con = dbc.getConnection();

  try {

con.setAutoCommit(false);// 更改JDBC事務(wù)的默認(rèn)提交方式

dbc.executeUpdate("delete from xiao where ID=" + sID);

dbc.executeUpdate("delete from xiao_content where ID=" + sID);

dbc.executeUpdate("delete from xiao_affix where bylawid=" + sID);

con點(diǎn)抗 mit();//提交JDBC事務(wù)

con.setAutoCommit(true);// 恢復(fù)JDBC事務(wù)的默認(rèn)提交方式

dbc.close();

return 1;

  }

  catch (Exception exc) {

con.rollBack();//回滾JDBC事務(wù)

exc.printStackTrace();

dbc.close();

return -1;

  }

}

在數(shù)據(jù)庫(kù)操作中,一項(xiàng)事務(wù)是指由一條或多條對(duì)數(shù)據(jù)庫(kù)更新的sql語(yǔ)句所組成的一個(gè)不可分割的工作單元。只有當(dāng)事務(wù)中的所有操作都正常完成了,整個(gè)事務(wù)才能被提交到數(shù)據(jù)庫(kù),如果有一項(xiàng)操作沒(méi)有完成,就必須撤消整個(gè)事務(wù)。

例如在銀行的轉(zhuǎn)帳事務(wù)中,假定張三從自己的帳號(hào)上把1000元轉(zhuǎn)到李四的帳號(hào)上,相關(guān)的sql語(yǔ)句如下:

update account set monery=monery-1000 where name='zhangsan'

update account set monery=monery+1000 where name='lisi'

這個(gè)兩條語(yǔ)句必須作為一個(gè)完成的事務(wù)來(lái)處理。只有當(dāng)兩條都成功執(zhí)行了,才能提交這個(gè)事務(wù)。如果有一句失敗,整個(gè)事務(wù)必須撤消。

在connection類(lèi)中提供了3個(gè)控制事務(wù)的方法:

(1) setAutoCommit(Boolean autoCommit):設(shè)置是否自動(dòng)提交事務(wù);

(2) commit();提交事務(wù);

(3) rollback();撤消事務(wù);

在jdbc api中,默認(rèn)的情況為自動(dòng)提交事務(wù),也就是說(shuō),每一條對(duì)數(shù)據(jù)庫(kù)的更新的sql語(yǔ)句代表一項(xiàng)事務(wù),操作成功后,系統(tǒng)自動(dòng)調(diào)用commit()來(lái)提交,否則將調(diào)用rollback()來(lái)撤消事務(wù)。

在jdbc api中,可以通過(guò)調(diào)用setAutoCommit(false) 來(lái)禁止自動(dòng)提交事務(wù)。然后就可以把多條更新數(shù)據(jù)庫(kù)的sql語(yǔ)句做為一個(gè)事務(wù),在所有操作完成之后,調(diào)用commit()來(lái)進(jìn)行整體提交。倘若其中一項(xiàng)sql操作失敗,就不會(huì)執(zhí)行commit()方法,而是產(chǎn)生相應(yīng)的sqlexception,此時(shí)就可以捕獲異常代碼塊中調(diào)用rollback()方法撤消事務(wù)。

網(wǎng)頁(yè)名稱(chēng):java事物處理代碼 java處理機(jī)制
分享地址:http://jinyejixie.com/article0/ddisooo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信公眾號(hào)、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作標(biāo)簽優(yōu)化、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
昌江| 阿拉善盟| 舟山市| 陇川县| 沁阳市| 岳西县| 威信县| 开鲁县| 罗城| 太仆寺旗| 汶上县| 临安市| 呼玛县| 乌兰浩特市| 福海县| 文山县| 资中县| 监利县| 凤阳县| 东乡族自治县| 开鲁县| 中宁县| 汝南县| 乌兰浩特市| 呼玛县| 龙川县| 云林县| 修武县| 犍为县| 汉阴县| 辽宁省| 嘉定区| 封丘县| 涡阳县| 西华县| 忻城县| 开阳县| 辰溪县| 潮州市| 临邑县| 睢宁县|