Java 事務(wù)詳解及簡單應(yīng)用實(shí)例
Java事務(wù)的簡單使用
Java事務(wù)在一些面試中會(huì)被問到。
面試的時(shí)候,我們首先要回答的是:事務(wù)能夠保證數(shù)據(jù)的完整性和一致性。
如果功力深厚點(diǎn)的話:就說一些原理(任務(wù)開始前先設(shè)置不提交任務(wù),在所有任務(wù)完成后再提交任務(wù),
如果任務(wù)在中間斷開,就執(zhí)行回滾,撤銷前面執(zhí)行的任務(wù)),簡單一點(diǎn)就舉個(gè)的例子(比如存錢和取錢的問題。
比如:銀行在兩個(gè)賬戶之間轉(zhuǎn)賬,從A賬戶轉(zhuǎn)入B賬戶1000元,系統(tǒng)先減少A賬戶的1000元,然后再為B賬號增加1000元。如果全部執(zhí)行成功,數(shù)據(jù)庫處于一致性;如果僅執(zhí)行完A賬戶金額的修改,而沒有增加B賬戶的金額,則數(shù)據(jù)庫就處于不一致狀態(tài),這時(shí)就需要取消前面的操作。)
本文對java事務(wù)做簡單的探討,一問到j(luò)ava事務(wù)我們要知道這和數(shù)據(jù)庫相關(guān)。
一.先看一段簡單的代碼
使用JDBC方式進(jìn)行事務(wù)處理
public int delete(int sID) {
//實(shí)現(xiàn)數(shù)據(jù)庫連接的類
DataBaseConnection 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.commit();//提交JDBC事務(wù)
con.setAutoCommit(true);// 恢復(fù)JDBC事務(wù)的默認(rèn)提交方式
dbc.close();
return 1;
}
catch (Exception exc) {
con.rollBack();//回滾JDBC事務(wù)
dbc.close();
return -1;
}
}
上面這一段代碼就是一個(gè)比較簡單的java事務(wù)的執(zhí)行。
上面三次執(zhí)行刪除操作,只要有一次執(zhí)行失敗,都會(huì)執(zhí)行任務(wù)回滾,相當(dāng)于要么一起成功,要么什么都沒做。
如果沒有事務(wù)的管理,前面執(zhí)行了就會(huì)馬上在數(shù)據(jù)庫里面更新,
執(zhí)行到哪里失敗就退出不再執(zhí)行后面的任務(wù),不能保證數(shù)據(jù)的一致性。
二.Java事務(wù)的基礎(chǔ)概念
原子性(Atomicity) :事務(wù)是一個(gè)完整的操作。事務(wù)的各步操作是不可分的(原子的);
要么都執(zhí)行,要么都不執(zhí)行
一致性(Consistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)
隔離性(Isolation) :對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,
它不應(yīng)以任何方式依賴于或影響其他事務(wù)
永久性(Durability) :事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性
java的事務(wù)處理描述:如果對數(shù)據(jù)庫進(jìn)行多次操作,每一次的執(zhí)行或步驟都是一個(gè)事務(wù).
如果數(shù)據(jù)庫操作在某一步?jīng)]有執(zhí)行或出現(xiàn)異常而導(dǎo)致事務(wù)失敗,這樣有的事務(wù)被執(zhí)行有的就沒有被執(zhí)行,
從而就有了事務(wù)的回滾,取消先前的操作.....
在數(shù)據(jù)庫操作中,一項(xiàng)事務(wù)是指由一條或多條對數(shù)據(jù)庫更新的sql語句所組成的一個(gè)不可分割的工作單元。
只有當(dāng)事務(wù)中的所有操作都正常完成了,整個(gè)事務(wù)才能被提交到數(shù)據(jù)庫,如果有一項(xiàng)操作沒有完成,
就必須撤消整個(gè)事務(wù)。
例如在銀行的轉(zhuǎn)帳事務(wù)中,假定張三從自己的帳號上把1000元轉(zhuǎn)到李四的帳號上,相關(guān)的sql語句如下:
update account set monery=monery-1000 where name='zhangsan'
update account set monery=monery+1000 where name='lisi'
這個(gè)兩條語句必須作為一個(gè)完成的事務(wù)來處理。只有當(dāng)兩條都成功執(zhí)行了,才能提交這個(gè)事務(wù)。
如果有一句失敗,整個(gè)事務(wù)必須撤消。
在connection類中提供了3個(gè)控制事務(wù)的方法:
(1) setAutoCommit(Boolean autoCommit):設(shè)置是否自動(dòng)提交事務(wù);
(2) commit();提交事務(wù);
(3) rollback();撤消事務(wù);
在jdbc api中,默認(rèn)的情況為自動(dòng)提交事務(wù),也就是說,每一條對數(shù)據(jù)庫的更新的sql語句代表一項(xiàng)事務(wù),
操作成功后,系統(tǒng)自動(dòng)調(diào)用commit()來提交,否則將調(diào)用rollback()來撤消事務(wù)。
在jdbc api中,可以通過調(diào)用setAutoCommit(false) 來禁止自動(dòng)提交事務(wù)。
然后就可以把多條更新數(shù)據(jù)庫的sql語句做為一個(gè)事務(wù),在所有操作完成之后,調(diào)用commit()來進(jìn)行整體提交。
倘若其中一項(xiàng) sql操作失敗,就不會(huì)執(zhí)行commit()方法,而是產(chǎn)生相應(yīng)的sqlException,
此時(shí)就可以捕獲異常代碼塊中調(diào)用rollback()方法撤消事務(wù)。
一般來說,專門開發(fā)數(shù)據(jù)庫的開發(fā)者肯定是要對事務(wù)了解很深入的,
但是一般的程序員不需要花費(fèi)太多時(shí)間在這方面。對大概作用有個(gè)理解就可以了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 詳解Java的MyBatis框架中的事務(wù)處理
- 詳解Java的JDBC API中事務(wù)的提交和回滾
- Java Spring 事務(wù)回滾詳解
- 在Java的JDBC使用中設(shè)置事務(wù)回滾的保存點(diǎn)的方法
- 深入解析Java中的JDBC事務(wù)
- Java事務(wù)的個(gè)人理解小結(jié)
- Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
- java事務(wù)回滾失敗問題分析
- Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能示例
- Java使用jdbc連接MySQL數(shù)據(jù)庫實(shí)例分析
- Java實(shí)現(xiàn)的mysql事務(wù)處理操作示例
相關(guān)文章
Java如何將String轉(zhuǎn)換成json對象或json數(shù)組
這篇文章主要介紹了Java如何將String轉(zhuǎn)換成json對象或json數(shù)組,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot+Spring Security無法實(shí)現(xiàn)跨域的解決方案
這篇文章主要介紹了SpringBoot+Spring Security無法實(shí)現(xiàn)跨域的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java獲取當(dāng)前時(shí)間的時(shí)間戳方法總結(jié)
Java中獲取時(shí)間戳的方式有很多種,下面這篇文章主要給大家介紹了關(guān)于Java獲取當(dāng)前時(shí)間的時(shí)間戳的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-06-06
SpringCloud turbine監(jiān)控實(shí)現(xiàn)過程解析
這篇文章主要介紹了SpringCloud turbine監(jiān)控實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Spring Boot 基于注解的 Redis 緩存使用詳解
本篇文章主要介紹了Spring Boot 基于注解的 Redis 緩存使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級)
壓縮文件在生活中經(jīng)常能用到,在Java中提供了壓縮和解壓縮文件的功能,本文主要介紹了Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級),感興趣的可以了解一下2024-03-03
SpringCloud超詳細(xì)講解微服務(wù)網(wǎng)關(guān)Gateway
這篇文章主要介紹了SpringCloud Gateway微服務(wù)網(wǎng)關(guān),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題
這篇文章主要介紹了mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

