當前位置:首頁 » 編程語言 » java中事務

java中事務

發布時間: 2022-12-27 01:27:58

『壹』 java事務的特性有哪些

ACID特徵
Atomic原子性、Consistency一致性、Isolation隔離性和Durability持久性。
原子性:指整個事務是不可以分割的工作單元。只有事務中所有的操作執行成功,才算整個事務成功,事務中任何一個sql語句執行失敗,那麼已經執行成功的SQL語句也必須撤銷,資料庫狀態應該回到執行事務前的狀態。
一致性:指資料庫事務不能破壞關系數據的完整性以及業務邏輯上的一致性。例如對於銀行轉賬事務,不管事務成功還是失敗,應該保證事務結束後兩個轉賬賬戶的存款總額是與轉賬前一致的。
隔離性:指的是在並發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。
持久性:指的是只要事務成功結束它對資料庫所做的更新就必須永久保存下來。即使發生系統崩潰,重新啟動資料庫系統後,資料庫還能恢復到事務成功結束時的狀態。

『貳』 java如何進行事務管理,什麼時候用事務控制

Java種運用了大量的事務管理,就是對一系列的資料庫操作進行統一的提交或回滾操作,比如說做一個轉賬功能,要更改帳戶兩邊的數據,這時候就必須要用事務才能算是嚴謹的做法。要麼成功,要麼失敗,保持數據一致性。如果中間有一個操作出現異常,那麼回滾之前的所有操作。
在strut2框架中為了避免多個用戶同時訪問伺服器,都會使用事務管理來管理訪問的人數。

『叄』 java中的事務

如果你用Spring框架,Spring中可以實現事務管理,在spring 配置文件中配置事務管理器,也可以使用Spring註解式事務,在方法上加上@Transactional註解。
@Transactional
public void save() {
//你的代碼邏輯

}
如果沒有使用Spring框架,可以用JDBC處理事務,如下:
try{
con.setAutoCommit(false);//開啟事務 ......
con.commit();//try的最後提交事務
} catch() {
con.rollback();//回滾事務
}

『肆』 java中多個事務公用一個連接嗎

spring事務
資料庫事務、連接與java線程之間的關系

最近在處理事務和多線程時,比較困擾資料庫事務,資料庫連接以及java線程之間的關系。

問題1:事務和連接的關系?

回答:對於資料庫事務來說先有一個連接,才能有事務,一個連接里可以有一次或多次事務的提交(自動提交或者手動提交)。對於java中的被transactional註解方法來說,這個被事務管理的方法中可能會使用多個連接。例如一個事務方法里嵌套一個propagation=required的事務方法時,外方法用一個連接,嵌套的方法用一個連接,並且是兩個不同的事務。

問題2:連接和線程的關系?

回答:從debug代碼看來,一個線程中有去操作資料庫,就會去CP獲取一個資料庫連接,如果此時CP中沒有連接可用,就會等待,直到有連接為止。

問題3:一個事務中(transactional註解的方法內)如果開啟了多個線程去執行其他的插入操作,那麼每個線程執行的插入操作,和線程的caller方法中的插入操作是同一個事務嗎?

回答:不是同一個事務

解析:

1.如下圖,一個transactional 註解的方法內,先做一次插入操作,接著開了3個線程去分別處理插入任務

 2.執行結果通過看debug日誌可看出,在執行testTransAndConnection方法時獲取了一個資料庫連接,並開啟了一個事務,並把事務設置為手動提交,然後進行插入操作,插入操作完成,就call起三個線程並且准備著手提交主方法里的事務了。

 3.每個線程是創建了不同的sqlsession 去處理的,這里用的連接卻都還是主方法釋放的那個連接(這里都是同一個連接的原因是由於服務起來後,第一次去請求應用,此時資料庫連接池還沒有初始化完畢,池子里只有剛剛初始化好的一個連接,其他的連接還沒來的及初始化出來,所以這里幾個線程的操作其實是大家都在等待並爭用那唯一的一個資料庫連接。等CP初始化完畢,如果再次觸發一次請求就會發現:每個線程的sqlsession都是不同的連接)

『伍』 如何在JAVA中實現事務呢

事務一般都是與資料庫操作相關的,直接使用JDBC的話,你可以通過設置是否自動commit,以及出異常後rollback來實現事務,如果你使用spring、hibernate等框架,它都會提供相應的事務配置。

『陸』 java事務相關

Java中的事務處理

一般情況下,J2EE應用伺服器支持JDBC事務、JTA(JavaTransactionAPI)事務、容器管理事務。一般情況下,最好不要在程序中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在盡可能短的時間內完成,不要在不同方法中實現事務的使用。下面我們列舉兩種事務處理方式。

1、JavaBean中使用JDBC方式進行事務處理
在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,打開一個連接對象Connection時,預設是auto-commit模式,每個SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。為了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之後,如果不調用commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法調用之後的所有SQL會在方法commit()調用時得到確認。

publicintdelete(intsID){
dbc=newDataBaseConnection();
Connectioncon=dbc.getConnection();
try{
con.setAutoCommit(false);//更改JDBC事務的默認提交方式
dbc.executeUpdate("deletefrombylawwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);
con.commit();//提交JDBC事務
con.setAutoCommit(true);//恢復JDBC事務的默認提交方式
dbc.close();
return1;
}
catch(Exceptionexc){
con.rollBack();//回滾JDBC事務
exc.printStackTrace();
dbc.close();
return-1;
}
}

2、SessionBean中的JTA事務
JTA是事務服務的J2EE解決方案。本質上,它是描述事務介面(比如UserTransaction介面,開發人員直接使用該介面或者通過J2EE容器使用該介面來確保業務邏輯能夠可靠地運行)的J2EE模型的一部分。JTA具有的三個主要的介面分別是UserTransaction介面、TransactionManager介面和Transaction介面。這些介面共享公共的事務操作,例如commit()和rollback(),但是也包含特殊的事務操作,例如suspend(),resume()和enlist(),它們只出現在特定的介面上,以便在實現中允許一定程度的訪問控制。例如,UserTransaction能夠執行事務劃分和基本的事務操作,而TransactionManager能夠執行上下文管理。

應用程序可以調用UserTransaction.begin()方法開始一個事務,該事務與應用程序正在其中運行的當前線程相關聯。底層的事務管理器實際處理線程與事務之間的關聯。UserTransaction.commit()方法終止與當前線程關聯的事務。UserTransaction.rollback()方法將放棄與當前線程關聯的當前事務。

publicintdelete(intsID){
DataBaseConnectiondbc=null;
dbc=newDataBaseConnection();
dbc.getConnection();
UserTransactiontransaction=sessionContext.getUserTransaction();//獲得JTA事務
try{
transaction.begin();//開始JTA事務
dbc.executeUpdate("deletefrombylawwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);
transaction.commit();//提交JTA事務
dbc.close();
return1;
}
catch(Exceptionexc){
try{
transaction.rollback();//JTA事務回滾
}
catch(Exceptionex){
//JTA事務回滾出錯處理
ex.printStackTrace();
}
exc.printStackTrace();
dbc.close();
return-1;
}
}

『柒』 JAVA設計模式之事務處理[1]

事務處理是企業應用需要解決的最主要的問題之一 J EE通過JTA提供了完整的事務管理能力 包括多個事務性資源的管理能力 但是大部分應用都是運行在單一的事務性資源之上(一個資料庫) 他們並不需要全局性的事務服務 本地事務服務已然足夠(比如JDBC事務管理) 本文並不討論應該採用何種事務處理方式 主要目的是討論如何更為優雅地設計事務服務 僅以JDBC事務處理為例 涉及到的DAO Factory Proxy Decorator等模式概念 請閱讀相關資料 也許你聽說過 事務處理應該做在service層 也許你也正這樣做 但是否知道為什麼這樣做?為什麼不放在DAO層做事務處理 顯而易見的原因是業務層介面的每一個方法有時候都是一個業務用例(User Case) 它需要調用不同的DAO對象來完成一個業務方法 比如簡單地以網上書店購書最後的確定定單為例 業務方法首先是調用BookDAO對象(一般是通過DAO工廠產生) BookDAO判斷是否還有庫存餘量 取得該書的價格信息等 然後調用CustomerDAO從帳戶扣除相應的費用以及記錄信息 然後是其他服務(通知管理員等) 簡化業務流程大概如此: 注意 我們的例子忽略了連接的處理 只要保證同一個線程內取的是相同的連接即可(可用ThreadLocal實現)

首先是業務介面 針對介面 而不是針對類編程

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

接下來就是業務介面的實現類??業務對象

public class BookStoreManagerImpl implements BookStoreManager{ public boolean buyBook(String bookId)throws SystemException{ Connection conn=ConnectionManager getConnection();//獲取資料庫連接 boolean b=false; try{ conn setAutoCommit(false); //取消自動提交 BookDAO bookDAO=DAOFactory getBookDAO(); CustomerDAO customerDAO=DAOFactory getCustomerDAO(); //嘗試從庫存中取書 if(BookDAO receInventory(conn bookId quantity)){ BigDecimal price=BookDAO getPrice(bookId); //取價格 //從客戶帳戶中扣除price*quantity的費用 b= CustomerDAO receAccount(conn price multiply(new BigDecimal(quantity)); 其他業務方法 如通知管理員 生成定單等 conn mit(); //提交事務 conn setAutoCommit(true); } }catch(SQLException e){ conn rollback(); //出現異常 回滾事務 con setAutoCommit(true); e printStackTrace(); throws new SystemException(e); } return b; } }

然後是業務代表工廠

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

這樣的設計非常適合於DAO中的簡單活動 我們項目中的一個小系統也是採用這樣的設計方案 但是它不適合於更大規模的應用 首先 你有沒有聞到代碼重復的 bad *** ell?每次都要設置AutoCommit為false 然後提交 出現異常回滾 包裝異常拋到上層 寫多了不煩才怪 那能不能消除呢?其次 業務代表對象現在知道它內部事務管理的所有的細節 這與我們設計業務代表對象的初衷不符 對於業務代表對象來說 了解一個與事務有關的業務約束是相當恰當的 但是讓它負責來實現它們就不太恰當了 再次 你是否想過嵌套業務對象的場景?業務代表對象之間的互相調用 層層嵌套 此時你又如何處理呢?你要知道按我們現在的方式 每個業務方法都處於各自獨立的事務上下文當中(Transaction Context) 互相調用形成了嵌套事務 此時你又該如何處理?也許辦法就是重新寫一遍 把不同的業務方法集中成一個巨無霸包裝在一個事務上下文中

我們有更為優雅的設計來解決這類問題 如果我們把Transaction Context的控制交給一個被業務代表對象 DAO和其他Component所共知的外部對象 當業務代表對象的某個方法需要事務管理時 它提示此外部對象它希望開始一個事務 外部對象獲取一個連接並且開始資料庫事務 也就是將事務控制從service層抽離 當web層調用service層的某個業務代表對象時 返回的是一個經過Transaction Context外部對象包裝(或者說代理)的業務對象 此代理對象將請求發送給原始業務代表對象 但是對其中的業務方法進行事務控制 那麼 我們如何實現此效果呢?答案是JDK 引進的動態代理技術 動態代理技術只能代理介面 這也是為什麼我們需要業務介面BookStoreManager的原因 首先 我們引入這個Transaction Context外部對象 它的代碼其實很簡單 如果不了解動態代理技術的請先閱讀其他資料

lishixin/Article/program/Java/gj/201311/27765

『捌』 事務是什麼在java中如何手工執行事務

舉個例子,銀行轉賬就是一個事物:從A賬戶減去金額,吧該金額轉到B賬戶中。吧所有操作完成並且數據同步到資料庫中,事物才栓完成。但是資料庫操作過程中可能發生錯誤,其中一個操作失敗,就會造成A+B賬戶金額與操作前的有出入,當發生錯誤後要取消操作(資料庫的事物回滾),保證數據的一致性。

手工執行事物:
1、關閉資料庫自動提交,
2、資料庫操作完成後如果出錯:回滾;沒有錯誤:提交
3、記得關閉資料庫連接

『玖』 Java 編程 ,事務管理的作用

事務就是對一系列的資料庫操作進行統一的提交或回滾操作,比如說做一個轉賬功能,要更改帳戶兩邊的數據,這時候就必須要用事務才能算是嚴謹的做法。要麼成功,要麼失敗,保持數據一致性。如果中間有一個操作出現異常,那麼回滾之前的所有操作。
這樣有什麼好處呢。
這樣可以防止在一些意外(例如說突然斷電)的情況下出現亂數據,防止資料庫數據出現問題。這邊加了錢,那邊卻還是一樣的數,這就完了。要是開放一個網上交易的平台,這樣就會出大問題的!
還有其他的一些操作,像是要添加多條數據,如果程序要求必須全部正確才能插入的話,事務又起大作用了。
等等。。。開發中為了避免這種情況一般都會進行事務管理。

在JDBC中是通過Connection對象進行事務管理的,默認是自動提交事務,可以手工將自動提交關閉,通過commit方法進行提交,rollback方法進行回滾,如果不提交,則數據不會真正的插入到資料庫中。

Hibernate中是通過Transaction進行事務管理,處理方法與JDBC中類似。

Spring中也有自己的事務管理機制,使用TransactionMananger進行管理,可以通過Spring的注入來完成此功能。

『拾』 如何手動控制java中的事務

很簡單,直接將autoCommit設置為false,就可以自己控制事務的提交和回滾!
大概是:conn.setAutoCommit(false);這個方法,然後開啟事務是:conn.beginTrainsaction();方法如有不準確,希望海涵!

熱點內容
工行密碼器怎麼買東西 發布:2024-11-01 08:00:02 瀏覽:711
查找子串的演算法 發布:2024-11-01 07:58:25 瀏覽:214
最快學編程 發布:2024-11-01 07:30:56 瀏覽:527
買福克斯買哪個配置好 發布:2024-11-01 07:01:07 瀏覽:36
pip更新python庫 發布:2024-11-01 06:42:57 瀏覽:666
憶捷加密軟體 發布:2024-11-01 06:34:05 瀏覽:353
androidlistview事件沖突 發布:2024-11-01 06:23:14 瀏覽:858
哈靈麻將在安卓上叫什麼名字 發布:2024-11-01 06:01:47 瀏覽:220
大學生解壓拓展哪裡靠譜 發布:2024-11-01 05:59:20 瀏覽:854
編譯函數求長方形面積和體積 發布:2024-11-01 05:52:16 瀏覽:745