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是不同的時候由不同的人、組織提出的開發方案。