13-jdbc分页+事务
一、 jdbc分頁
1. 什么是分頁
在數據量較大的情況下,我們會數據分作多頁顯示,讓用戶瀏覽起來更加的方便,可以根據頁碼去翻閱每一頁的數據
?
2. 如何實現分頁的分析
說到分頁,一般都會立刻想到先將數據存入集合,再將數據分作多頁顯示,這樣的做法固然可以,可是一旦數據量較大的話就會造成內存的溢出,再者說,大部分用戶的瀏覽習慣都是只看前三頁,如果數據總共有100頁,那就完全沒必要將數據全部從數據庫中查出來了,所以一個普遍的實現方式都是根據用戶需要瀏覽的頁碼,從數據庫中查詢一頁的數據供用戶瀏覽
?
分頁的目的就是為了更加合理地做頁面顯示,所以首先要解決的就是頁面需要顯示哪些數據
通常來講,頁面上會顯示當前頁的信息、當前第幾頁、總共多少頁、頁碼、上一頁、下一頁等信息
我們可以使用一個 Page 對象來封裝頁面需要實現的數據
在service中計算出 Page 對象所需的數據
Service中需要的一些來自于數據庫的數據就找 Dao 索取
?
3. 分頁的具體實現
1)根據需求設計Page對象
2)dao的實現
?????? 兩個方法
?????? int getTotalRecord(); ??? // 獲得總記錄數
?????? List getPageData(int start, int len);? // 獲得分頁數據
3)service 實現
?????? Page getPage(int pageNum);? // 計算分頁數據
4)Servlet
?????? 獲得頁面提交的 pageNum
?????? 找service計算出分頁數據? Page
?????? 轉發給jsp 做分頁顯示
?
二、 jdbc 事務
1. 什么是事務
所謂事務,就是針對數據庫的一組操作(多條sql)
特點:位于同一個事務的操作具備同步的特點,也就是要么都成功,要么都失敗
?
2. 事務的作用
在實際中,我們的很多操作都是需要由多條sql來共同完成的,例如,A賬戶給B賬戶轉賬就會對應兩條sql
update account set money=money-100 where name=‘a’;
update account set money=money+100 where name=‘b’;
提交事務?? 提交事務中的所有操作
假設第一條sql成功了,而第二條sql失敗了,這樣就會導致a賬戶損失了100元,而b賬戶并未得到100元
?
如果將兩條sql放在一個sql中,當第二條語句失敗時,第一條sql語句也同樣不會生效,
這樣a賬戶就不會有任何的損失
?
?
3. 事務的實現原理
默認情況下,我們向數據庫發送的sql語句是會被自動提交的,開啟事務就是相當于關閉自動提交功能,改為手動提交,我們只需要將提交事務的操作放在最后一個操作,這樣一來,如果在提交事務之前出現異常,由于沒有執行提交操作,事務中未提交的操作就會被回滾掉
?
4. 例子
account.sql
create table account(
?????? id int primary key auto_increment,
?????? name varchar(40),
?????? money float
)character set utf8 collate utf8_general_ci;
?
insert into account(name,money) values('aaa',1000);
insert into account(name,money) values('bbb',1000);
insert into account(name,money) values('ccc',1000);
?
aaa 給 bbb 轉賬 100元
update account set money=money-100 where name='aaa';
// 異常退出
update account set money=money+100 where name='bbb';
?
// 查詢結果
select * from accont;
?
如果開啟事務就可以避免剛才的錯誤發生
// 開啟事務
start transaction;
?
// 如果操作執行完畢,我們需要將事務提交
commit;
?
// 還可以手動回顧事務中所有未提交的事務
rollback;
?
命令行做實驗得出結論:
如果開了一個事務,又敲了一次 start transaction 再次開啟事務,前一個事務會自動提交
?
5、在程序中使用 jdbc 開啟事務
在使用 jdbc 操作數據庫時,需要使用 Connection 對象對事務進行管理
// 開啟事務
Connection.setAutoCommit(false);?????? //設置自動提交為false
// 回滾事務
Connection.rollback();??
//提交事務
Connection.commit();???
?
在 jdbc 程序中我們還可以設置回滾點,讓事務回顧到指定的回滾點,而不是自動回滾所有未提交的操作
需要將程序中的異常捕獲,在catch語句塊中回滾事務,在finally中提交事務
注意,將 Commit 操作放在 finally 中是為了保證提交未回滾的事務操作
?
6. 事務的特性
事務有四大特性,一般來講,判斷一個數據庫是否支持事務,就看數據庫是否支持這四個特性
l? 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。?
?
l? 一致性(Consistency)
事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
?
l? 隔離性(Isolation)
事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
?
l? 持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。
?
7. 事務的隔離級別
1)多線程開啟事務
?????? 由于數據庫是多線程并發訪問的,所以很容易出現多個線程同時開啟事務的情況
?????? 多線程開事務容易引起贓讀、不可重復讀、幻讀的情況發生
?
?????? 贓讀:dirty read
?????? 是指一個事務讀取了另一個事務未提交的數據,這是相當危險的。
?????? 設想一下,A要給B轉賬100元購買商品,如果A開啟了一個事務做了轉賬的工作
?????? update account set money=money+100 while name=‘b’;??????
?????? update account set money=money -100 while name=‘a’;
?????? A先不提交事務,通知B來查詢
?????? 這時B來查詢賬戶,由于會讀到A開啟的事務中未提交的數據,就會發現A確實給自己轉了100元,
?????? 自然就會給A發貨,A等B發貨后就將事務回滾,不提交,此時,B就會受到損失
??????
?????? 不可重復讀:non-repeatable read
?????? 是指事務中兩次查詢的結果不一致,原因是在查詢的過程中其他事務做了更新的操作 update
?????? 例如,銀行做報表,第一次查詢A賬戶有100元,第二次查詢A賬戶有200元,原因是期間A存了100元
?????? 這樣就會導致銀行多次統計的報表不一致
?
和臟讀的區別是:
臟讀是讀取前一事務未提交的臟數據,不可重復讀是在事務內重復讀取了別的線程已提交的數據。
?
有的時候大家會認為這樣的結果是正確的,沒問題
我們可以考慮這樣一種情況,比如銀行程序需要將查詢結果分別輸出到電腦屏幕和寫到文件中,結果在一個事務中針對輸出的目的地,進行的兩次查詢不一致,導致文件和屏幕中的結果不一致,銀行工作人員就不知道以哪個為準了。
?
幻讀:phantom read??? 又名虛讀
是指在一個事務內兩次查詢中數據筆數不一致
幻讀和不可重復讀有些類似,是指兩次查詢過程中,其他事務做了插入記錄的操作,導致記錄數有所增加
insert
?
例如銀行做報表統計account表中所有用戶的總額時,此時總共
?????? 五個賬戶,總金額為500元,這時有一個新的賬戶產生了,并且
?????? 存了100元,這時銀行再統計會發現帳戶總金額為600元了,造
?????? 成虛讀同樣會使銀行遇到同樣的困惑
?
?????? 實驗發現不會出現虛讀
?????? 來自網絡的解釋:
?????? 幻讀只是在理論上會發生的一種情況,而現實操作中并不是一定會發生
?
2)設置事務的隔離級別
?????? 為了避免多線程開事務引發的問題,我們需要將事務進行隔離
?????? 事務有四種隔離級別,不同的隔離級別可以防止不同的錯誤發生
?????? serializable:可串行化,能避免臟讀、不可重復讀、幻讀情況的發生
repeatable read:可重讀,能避免臟讀、不可重復讀情況的發生(實際上mysql在實現的時候避免了虛讀)
read committed:讀取提交的內容,可避免臟讀情況發生
read uncommitted:讀取未提交的內容,最低級別,避免不了任何情況
?
操作:
設置事務隔離級別
set?? transaction isolation level
查詢當前事務隔離級別
select @@tx_isolation??
?
總結
以上是生活随笔為你收集整理的13-jdbc分页+事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 德军装甲军团的秘密武器
- 下一篇: 库尔斯克坦克大会战:二个硬汉的生死决斗