Java-MVC-事務管理

1.【事務的概述】

事務指的是邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗。

2.MySql的事務管理:MySql數據庫事務管理是自動提交的,Oracle數據庫事務默認是不自動提交的。

***2.1手動開啓事務

Start transaction; —開啓事務
多條sql;
commit、rollback;
***2.2設置一個自動提交參數
show variable like’%commit%’ — 查看與commit相關的參數
set autocommit = 0; –將autocommit參數設置爲OFF;

3.JDBC中的事務管理

JDBC的事務管理的API:
- setAutoCommit()
- Commit()
- rollback()

4.轉賬案例

【步驟一】:創建一個頁面
【步驟二】:導入JDBC相關的jar包和工具類
【步驟三】:創建包結構
【步驟四】:提交到Servlet -》 service -》 DAO
【步驟五】:頁面跳轉。

*兩種方式:

在業務層獲得Connection通過參數傳遞給Dao,DBUtils進行事務管理。
在業務層獲得Connection,將這個連接板定在當前的 線程中。在DAO中獲得連接的話,可以從當前的線程中獲取。
ThreadLocal:Hibernate框架。

5.DBUtils實現事務管理

沒有事務管理:QueryRunner(Database ds)
Query、update
有事務管理:QueryRunner()
Query、update

6.總結

6.1事務特性:

原子性:強調事務的不可分割
一致性:強調事務的執行的強,數據的完整性要保持一致。
隔離性:一個事務的執行,不應該受到其他事務的干擾。
持久性:事務一旦結束(提交、回滾),數據就持久保持到數據庫。

6.2 如果不考事務的隔離性,引發一些安全問題:

一類讀問題:
- 髒讀:一個事務讀到了另一個事務沒有提交的數據。
- 不可重複讀:一個事務讀到了另一個事物已經Update的數據,導致當前的事務中多次查詢結果不一致。
- 虛讀、幻讀:一個事務讀到另一個事務一經提交的insert數據,導致在當前的事務中多次查詢結果不一致。
一類寫問題:
- 引發兩類丟失更新;

6.3解決引發的讀問題

設置事務的隔離級別:
- Read uncommitted :未提交讀,髒讀,不可重複讀,虛讀都可能發生。
- Read committed :已提交讀,避免髒讀,但是不可重複讀和虛讀可能發生。
- repeated read:可重複讀,避免髒讀,不可重複讀,但是虛讀可能會發生。
- serializable:穿行讀,避免髒讀,不可重複讀,虛讀的發生,

MYSQL隔離級別:repeatable read Oracle隔離級別:Read committed
查看mysql的隔離級別: select @@tx_isolation;

7演示髒讀的發生:

分別開啓兩個窗口:A,B
分別查看兩個窗口的隔離級別:select @@tx_isolation;
設置A窗口的隔離級別爲read uncommitted。****set session transaction isolation level read uncommitted;
分別在兩個窗口中開啓事務:Start transaction;
在B窗口中完成轉賬的操作:
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A窗口中進行查詢:
A窗口錢已到賬。
在B窗口中rollback,錢又返回了。—-A事務讀到了B事務還沒有提交的數據。

7.1演示避免髒讀,不可重複讀

分別開啓兩個窗口:A,B
分別查看兩個窗口的隔離級別:select @@tx_isolation;
設置A窗口的隔離級別爲read uncommitted。****set session transaction isolation level read committed;
分別在兩個窗口中開始事務:
Start transaction
在B窗口中完成轉賬的操作:
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A創建口中進行查詢:—- 避免了髒讀;
在B窗口中提交了事務;
commit();
在A窗口在次查詢:—轉賬成功(不可重複讀:一個事務讀到另一個事務中已經提交的update的數據,導致多次查詢結果不一致)

7.2演示避免不可重複讀:

分別開啓兩個窗口:A,B
分別查看兩個窗口的隔離級別:select @@tx_isolation;
設置A窗口的隔離級別爲read uncommitted。****set session transaction isolation level repeatable read;
分別在兩個窗口中開啓事務。
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A窗口中進行查詢:—轉賬沒有成功
在B窗口提交事務:
在A窗口中在次查詢:—沒有變化,轉賬沒有成功:避免了不可重複讀。
在A窗口中commit;
在A窗口中再次查詢。

7.3避免虛讀:

分別開啓兩個窗口:A,B
分別查看兩個窗口的隔離級別:select @@tx_isolation;
設置A窗口的隔離級別爲read uncommitted。****set session transaction isolation level serializable;
在A,B兩個窗口中分別開啓事務
在B窗口中完成insert操作:
insert into account(id,name,money) values(7,’shally’,5000);
在A創建中進行查詢的操作
A卡住,等待狀態; — 沒查到任何結果,等待B提交。
在B中提交,A中就顯示出來了。
串行,必須的等一個事務成功後,在進行下一步。

總結

EE開發的三層結構:

客戶端層 :Java Applet、HTML、CSS、JS
WEB層 :Servlet + JSP
業務層 : EJB
持久層 : Dao
EE開發中的經典的三層結構:
WEB:Servlet JSP — Struts2、SpringMVC、Struts1,WebWork
JavaBean — Spring
JDBC —- MyBatis 、Hibernate、DBUtils、JDBCTemplate
使用Servlet + JSP + JavaBean + JDBC 開發。

EE的三層架構和MVC是不同的時候由不同的人、組織提出的開發方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章