java里,怎么寫事務控制
我一個方法里,執行了文件操作、數據庫操作等....rn如果用Connection手動提交的話,就只對數據庫操作生效,對文件操作不管用rn我想對這個方法進行事務控制,要怎么寫?rn(沒使用spring、hibernate)對文件操作的事物控制?
那就得從新寫了~
其實就是寫個指令的緩沖
比如Hibernate的Session,就是把SQL語句(版或者HQL)先存權起來,然后commit的時候再一次執行(當然其中沒那么簡單,也使用了cglib來同步實體對象)
你寫的話,其實也是寫個緩沖而且,調用的方法表面是
delete()(這個方法需要你自己實現的,而不是File類的delete())
其實內部只是記下個指令而已
這僅僅是思路,具體還要看你的
lz可能想在上傳,復修改,制刪除文件時,同時操作數據庫記錄吧?
更正一下,只有對數據庫的一組操作才叫事物,操作文件是業務邏輯,不能寫在一起。你可以先完成對文件的操作,再根據文件的操作情況(操作成功與否)操作數據庫,一個在業務層,一個在持久層。
Java中為了控制事務的一致性,會使用插入回滾點、callback方法,保證數據不被篡改,示例如下:
public String delete(String id) {
String ID = id;
db = new getConnection();
Connection con = db.getConnection();
try {
con.setAutoCommit(false);
db.executeUpdate("delete from helloworld where ID=" + ID); //更新操作1
db.executeUpdate("delete from helloworld _book where ID=" + ID); //更新操作2
db.executeUpdate("delete from helloworld_user where ID=" + ID); //更新操作3
con.commit();//提交JDBC事務
con.setAutoCommit(true);
db.close();
return “success”;
}
catch (Exception e) {
con.rollBack();//回滾JDBC事務
e.printStackTrace();
db.close();
return “fail”;
}
}
簡單的~在連接了數據庫之后,將自動commit的參數改為false,conn.setAutoCommit( false );
并在執行了sql語句之后調用conn.commit();
就可以了
java中的事務到底怎么理解舉個實際的例子
比如說你去銀行轉賬,將將 A 賬戶中的金額轉到B賬戶。
A 語句:update Table set amount = amount - 100 where id = 'A'"
B語句:update Table set amount = amount + 100 where id = 'B'"
會有兩版條update語句,如果不權用事務處理的話,在A語句執行完之后,在執行B語句的時候出錯,那么A賬戶的金額減少了,B賬戶的金額卻沒有增加,這就有問題了
所以要用到事務來控制,如果B語句出現錯誤,就將事務回滾,A賬戶的金額也不會減少。
如果A。B都執行成功,事務提交
簡單來說就是所有在事務中的語句必須全部執行成功,事務才會提交,如果有一條執行失敗,事務就會回滾。
JAVA事務的特性有哪些
ACID特征
Atomic原子性、Consistency一致性、Isolation隔離性和Durability持久性。
原子性:指整個事務是不可專以分割的工作單元。屬只有事務中所有的操作執行成功,才算整個事務成功,事務中任何一個SQL語句執行失敗,那么已經執行成功的SQL語句也必須撤銷,數據庫狀態應該回到執行事務前的狀態。
一致性:指數據庫事務不能破壞關系數據的完整性以及業務邏輯上的一致性。例如對于銀行轉賬事務,不管事務成功還是失敗,應該保證事務結束后兩個轉賬賬戶的存款總額是與轉賬前一致的。
隔離性:指的是在并發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。
持久性:指的是只要事務成功結束它對數據庫所做的更新就必須永久保存下來。即使發生系統崩潰,重新啟動數據庫系統后,數據庫還能恢復到事務成功結束時的狀態。望采納你,謝謝。
java的事務處理
try{rn java.sql.Connection conn= 獲得一個連接;rn conn.setAutoCommit(false);rn .....具體的數據庫操作(多個)rn conn.commit();rn}catch(Exception ex){rn conn.rollback();rn}rn的conn.setAutoCommit(false);時報jdbc鏈接錯誤,使用conn.setAutoCommit(true);時,就沒問題,是什么原因??把錯誤原因貼出來吧。而且你的這段代碼本身存在編譯的問題,變量conn是在try{}中定義的,在catch(){}塊中根本就沒有這個變量,編譯能通過嗎?
你連接的是什么數據庫?微軟的Access不支持事務的,只能立即提交操作,你setAutoCommit(true)肯定是不支持了,建議用MySQL進行學習
你的連接URL路徑拿來看看
java事務相關
java事務相關前幾天父親銀行卡收到工資,是同一時間打進去的兩筆錢,收到兩條相隔約20分鐘的兩條提醒短信,為說明情況,假設卡內余額為100元,第一條短信顯示,收到900元,余額為2000元,第二條顯示收到1000元,余額為1000元。也就是說,兩條短信里的余額其實反過來了。那么請問,導致這個問題發生的原因和事務有關嗎?如果有關,這種情況屬于虛讀嗎?還是其他?謝謝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;
}
}
你所看到的第一條短信是后面發的,第二條短信是一開始發的,(也就是第一次發的)
你這個假設是不是假設錯了?這個假設如果是對的那么這個情況是不可理解的
用真實的數據來陳述
相關推薦:
挪用個體公司資金(挪用個體戶資金犯罪嗎)
騙取出口退稅罪構成(進出口騙稅1000萬怎么處罰)
強迫交易罪(強迫交易罪立案標準以及刑事責任)
期貨居間人(什么是期貨居間人)
強奸罪坐牢多少年(強奸罪判多少年刑)