Java 事務(wù)詳解及簡(jiǎn)單應(yīng)用實(shí)例
Java事務(wù)的簡(jiǎn)單使用
Java事務(wù)在一些面試中會(huì)被問(wèn)到。
面試的時(shí)候,我們首先要回答的是:事務(wù)能夠保證數(shù)據(jù)的完整性和一致性。
如果功力深厚點(diǎn)的話:就說(shuō)一些原理(任務(wù)開始前先設(shè)置不提交任務(wù),在所有任務(wù)完成后再提交任務(wù),
如果任務(wù)在中間斷開,就執(zhí)行回滾,撤銷前面執(zhí)行的任務(wù)),簡(jiǎn)單一點(diǎn)就舉個(gè)的例子(比如存錢和取錢的問(wèn)題。
比如:銀行在兩個(gè)賬戶之間轉(zhuǎn)賬,從A賬戶轉(zhuǎn)入B賬戶1000元,系統(tǒng)先減少A賬戶的1000元,然后再為B賬號(hào)增加1000元。如果全部執(zhí)行成功,數(shù)據(jù)庫(kù)處于一致性;如果僅執(zhí)行完A賬戶金額的修改,而沒有增加B賬戶的金額,則數(shù)據(jù)庫(kù)就處于不一致狀態(tài),這時(shí)就需要取消前面的操作。)
本文對(duì)java事務(wù)做簡(jiǎn)單的探討,一問(wèn)到j(luò)ava事務(wù)我們要知道這和數(shù)據(jù)庫(kù)相關(guān)。
一.先看一段簡(jiǎn)單的代碼
使用JDBC方式進(jìn)行事務(wù)處理
public int delete(int sID) { //實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接的類 DataBaseConnection dbc = new DataBaseConnection(); //獲取連接對(duì)象 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è)比較簡(jiǎn)單的java事務(wù)的執(zhí)行。
上面三次執(zhí)行刪除操作,只要有一次執(zhí)行失敗,都會(huì)執(zhí)行任務(wù)回滾,相當(dāng)于要么一起成功,要么什么都沒做。
如果沒有事務(wù)的管理,前面執(zhí)行了就會(huì)馬上在數(shù)據(jù)庫(kù)里面更新,
執(zhí)行到哪里失敗就退出不再執(zhí)行后面的任務(wù),不能保證數(shù)據(jù)的一致性。
二.Java事務(wù)的基礎(chǔ)概念
原子性(Atomicity) :事務(wù)是一個(gè)完整的操作。事務(wù)的各步操作是不可分的(原子的);
要么都執(zhí)行,要么都不執(zhí)行
一致性(Consistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)
隔離性(Isolation) :對(duì)數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,
它不應(yīng)以任何方式依賴于或影響其他事務(wù)
永久性(Durability) :事務(wù)完成后,它對(duì)數(shù)據(jù)庫(kù)的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性
java的事務(wù)處理描述:如果對(duì)數(shù)據(jù)庫(kù)進(jìn)行多次操作,每一次的執(zhí)行或步驟都是一個(gè)事務(wù).
如果數(shù)據(jù)庫(kù)操作在某一步?jīng)]有執(zhí)行或出現(xiàn)異常而導(dǎo)致事務(wù)失敗,這樣有的事務(wù)被執(zhí)行有的就沒有被執(zhí)行,
從而就有了事務(wù)的回滾,取消先前的操作.....
在數(shù)據(jù)庫(kù)操作中,一項(xiàng)事務(wù)是指由一條或多條對(duì)數(shù)據(jù)庫(kù)更新的sql語(yǔ)句所組成的一個(gè)不可分割的工作單元。
只有當(dāng)事務(wù)中的所有操作都正常完成了,整個(gè)事務(wù)才能被提交到數(shù)據(jù)庫(kù),如果有一項(xiàng)操作沒有完成,
就必須撤消整個(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類中提供了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ù)。
一般來(lái)說(shuō),專門開發(fā)數(shù)據(jù)庫(kù)的開發(fā)者肯定是要對(duì)事務(wù)了解很深入的,
但是一般的程序員不需要花費(fèi)太多時(shí)間在這方面。對(duì)大概作用有個(gè)理解就可以了。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 詳解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ù)回滾失敗問(wèn)題分析
- Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫(kù)功能示例
- Java使用jdbc連接MySQL數(shù)據(jù)庫(kù)實(shí)例分析
- Java實(shí)現(xiàn)的mysql事務(wù)處理操作示例
相關(guān)文章
性能爆棚的實(shí)體轉(zhuǎn)換復(fù)制工具M(jìn)apStruct使用詳解
這篇文章主要為大家介紹了性能爆棚的實(shí)體轉(zhuǎn)換復(fù)制工具M(jìn)apStruct使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Java?C++題解leetcode672燈泡開關(guān)示例
這篇文章主要為大家介紹了Java?C++題解leetcode672燈泡開關(guān)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java微信小程序醫(yī)院掛號(hào)系統(tǒng)
這篇文章主要介紹了基于Java微信小程序醫(yī)院掛號(hào)系統(tǒng),可以實(shí)現(xiàn)遠(yuǎn)程處理事務(wù),遠(yuǎn)程提交工作和隨時(shí)追蹤工作的狀態(tài),文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-03-03使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器
這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java多線程實(shí)戰(zhàn)之交叉打印的兩種方法
今天小編就為大家分享一篇關(guān)于Java多線程實(shí)戰(zhàn)之交叉打印的兩種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Spring?Boot?快速使用?HikariCP?連接池配置詳解
Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項(xiàng)目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會(huì)被自動(dòng)引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下2023-06-06Java中的信號(hào)量Semaphore詳細(xì)解讀
這篇文章主要介紹了Java中的信號(hào)量Semaphore詳細(xì)解讀,Java信號(hào)量機(jī)制可以用來(lái)保證線程互斥,創(chuàng)建Semaphore對(duì)象傳入一個(gè)整形參數(shù),類似于公共資源,需要的朋友可以參考下2023-11-11關(guān)于RestTemplate中的Get請(qǐng)求
這篇文章主要介紹了關(guān)于RestTemplate中的Get請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07