日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13-jdbc分页+事务

發布時間:2024/9/27 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13-jdbc分页+事务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 jdbc分頁

1. 什么是分頁

在數據量較大的情況下,我們會數據分作多頁顯示,讓用戶瀏覽起來更加的方便,可以根據頁碼去翻閱每一頁的數據

?

2. 如何實現分頁的分析

說到分頁,一般都會立刻想到先將數據存入集合,再將數據分作多頁顯示,這樣的做法固然可以,可是一旦數據量較大的話就會造成內存的溢出,再者說,大部分用戶的瀏覽習慣都是只看前三頁,如果數據總共有100頁,那就完全沒必要將數據全部從數據庫中查出來了,所以一個普遍的實現方式都是根據用戶需要瀏覽的頁碼,從數據庫中查詢一頁的數據供用戶瀏覽

?

分頁的目的就是為了更加合理地做頁面顯示,所以首先要解決的就是頁面需要顯示哪些數據

通常來講,頁面上會顯示當前頁的信息、當前第幾頁、總共多少頁、頁碼、上一頁、下一頁等信息

我們可以使用一個 Page 對象來封裝頁面需要實現的數據

service中計算出 Page 對象所需的數據

Service中需要的一些來自于數據庫的數據就找 Dao 索取

?

3. 分頁的具體實現

1)根據需求設計Page對象

2dao的實現

?????? 兩個方法

?????? int getTotalRecord(); ??? // 獲得總記錄數

?????? List getPageData(int start, int len);? // 獲得分頁數據

3service 實現

?????? Page getPage(int pageNum);? // 計算分頁數據

4Servlet

?????? 獲得頁面提交的 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發貨,AB發貨后就將事務回滾,不提交,此時,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分页+事务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。