標籤:javaweb JSP模式&JDBC進階篇
今日任務
? 使用MVC設計模式開發一個轉賬案例
教學導航
教學目標
掌握JSP的設計模式
瞭解MYSQL的交易管理
掌握JDBC的交易管理
會使用DBUtils完成事務的管理
教學方法
案例驅動法
1.1 上次課內容回顧:
JSP :
1.2.2.2 步驟分析:
【步驟一】:建立一個頁面:
【步驟二】:匯入JDBC相關的jar包和工具類.
【步驟三】:建立包結構.
【步驟四】:提交到Servlet-->Service-->DAO
【步驟五】:頁面跳轉:
1.2.3 代碼實現:1.2.3.1 準備工作:
1.2.3.2 代碼實現:
1.2.3.3 DBUtils實現交易管理:
? 沒有交易管理:
? 有交易管理:
1.2.4 總結:1.2.4.1 事務特性:
? 原子性:強調事務的不可分割.
? 一致性:強調的是事務的執行的前後,資料的完整性要保持一致.
? 隔離性:一個事務的執行不應該受到其他事務的幹擾.
? 持久性:事務一旦結束(提交/復原)資料就持久保持到了資料庫.
1.2.4.2 如果不考慮事務的隔離性,引發一些安全性問題:
? 一類讀問題:
- 髒讀 :一個事務讀到另一個事務還沒有提交的資料.
- 不可重複讀取 :一個事務讀到了另一個事務已經提交的update的資料,導致在當前的事務中多次查詢結果不一致.
- 虛讀/幻讀 :一個事務讀到另一個事務已經提交的insert的資料,導致在當前的事務中多次的查詢結果不一致.
? 一類寫問題:
- 引發兩類丟失更新:
1.2.4.3 解決引發的讀問題:
設定事務的隔離等級:
- read uncommitted :未提交讀.髒讀,不可重複讀取,虛讀都可能發生.
- read committed :已提交讀.避免髒讀.但是不可重複讀取和虛讀有可能發生.
- repeatable read :可重複讀.避免髒讀,不可重複讀取.但是虛讀有可能發生.
- serializable :序列化的.避免髒讀,不可重複讀取,虛讀的發生.
***** MYSQL隔離等級:repeatable read Oracle隔離等級:read committed
1.2.4.4 示範髒讀的發生:
? 分別開啟兩個視窗:A,B
? 分別查看兩個視窗的隔離等級:select @@tx_isolation;
? 設定A視窗的隔離等級為:read uncommitted:
- set session transaction isolation level read uncommitted;
? 分別在兩個視窗中開啟事務:
- start transaction;
? 在B視窗完成轉賬的操作:
- update account set money = money - 1000 where name = ‘張森‘;
- update account set money = money + 1000 where name = ‘鳳姐‘;
? 在A視窗查詢資料:(錢已經到賬---髒讀)
- select * from account; -- A事務讀到了B事務還沒有提交的資料.
1.2.4.5 示範避免髒讀,不可重複讀取發生
? 分別開啟兩個視窗:A,B
? 分別查看兩個視窗的隔離等級:select @@tx_isolation;
? 設定A視窗的隔離等級為:read committed:
- set session transaction isolation level read committed;
? 分別在兩個視窗中開啟事務:
- start transaction;
? 在B視窗完成轉賬的操作:
- update account set money = money - 1000 where name = ‘張森‘;
- update account set money = money + 1000 where name = ‘鳳姐‘;
? 在A視窗中進行查詢:
- select * from account; -- 避免髒讀.
? 在B視窗提交事務:
- commit;
? 在A視窗中重新查詢:
- select * from account; -- 轉賬成功.(不可重複讀取:一個事務讀到另一個事務中已經提交的update的資料,導致多次查詢結果不一致.)
1.2.4.6 示範避免不可重複讀取:
? 分別開啟兩個視窗:A,B
? 分別查看兩個視窗的隔離等級:select @@tx_isolation;
? 設定A視窗的隔離等級為:repeatable read:
- set session transaction isolation level repeatable read;
? 分別在兩個視窗中開啟事務:
- start transaction;
? 在B視窗完成轉賬的操作:
- update account set money = money - 1000 where name = ‘張森‘;
- update account set money = money + 1000 where name = ‘鳳姐‘;
? 在A視窗查詢:
- select * from account; -- 轉賬沒有成功:避免髒讀.
? 在B視窗提交事務:
- commit;
? 在A視窗中重新查詢:
- select * from account; -- 轉賬沒有成功:避免不可重複讀取.
1.2.4.7 示範避免虛讀的發生:
? 分別開啟兩個視窗:A,B
? 分別查看兩個視窗的隔離等級:select @@tx_isolation;
? 設定A視窗的隔離等級為:serializable:
- set session transaction isolation level serializable;
? 在A,B兩個視窗中分別開啟事務:
- start transaction;
? 在B視窗中完成一個insert操作:
- insert into account values (null,‘王老師‘,10000);
? 在A建立中進行查詢的操作:
- select * from account; -- 沒有查詢到任何結果.
? 在B視窗提交事務:
- commit; -- A視窗馬上就會顯示資料.
第13章WEB13-JSP模式&JDBC進階篇