1. 程式人生 > >Oracle事務、檢視、序列

Oracle事務、檢視、序列

回顧什麼是事務?
一個不可分割的子操作形成一個整體,該整體要麼全部執行成功,要麼全部執行失敗。例如:轉帳

回顧為什麼要用事務?
如果不用事務的話,為轉帳為例,可能出現一個使用者錢增加了,另一個使用者錢不變

回顧程式設計中,事務可用於哪一層?
事務放在業務層

回顧jdbc程式設計中,如何使用事務?
connection.setAutoCommit(false);
pstmt.executeUpdate();
connection.commit();
connection.rollback();

回顧hibernate程式設計中,如何使用事務?
transaction.begin();
session.save(
new User()); transaction.commit(); transaction.rollback(); 回顧spring程式設計中,如何使用事務? spring可以分為二種 >程式設計式事務,藕合 >宣告式事務,解藕,提倡 Oracle的事務只針對DML操作,即select/insert/update/delete 回顧MySQL的事務開始:start transaction Oracle的事務開始:第一條DML操作做為事務開始 Oracle的提交事務 (1)顯示提交:commit (2)隱藏提交:DDL/DCL/exit(sqlplus工具) 注意:提交是的從事務開始到事務提交中間的內容,提交到ORCL資料庫中的DBF二進位制檔案 Oracle的回滾事務 (
1)顯示回滾:rollback (2)隱藏回滾:關閉視窗(sqlplus工具),宕機,掉電 注意:回滾到事務開始的地方 回顧什麼是回滾點? 在操作之間設定的一個標誌位,用於將來回滾之用 回顧為什麼要設定回滾點?savepoint a;rollback to savepoint a; 如果沒有設定回滾點的話,Oracle必須回滾到事務開始的地方,其間做的一個正確的操作也將撤銷 使用savepoint 回滾點,設定回滾點a savepoint a; 使用rollback to savepoint,回滾到回滾點a處 rollback to savepoint a; Oracle提交或回滾後,原來設定的回滾點還有效嗎? 原回滾點無效了 Oracle之所以能回滾的原因是? 主要機制是例項池 回顧MySQL支援的四種事務隔離級別及能夠解決的問題 (
1)read uncommitted -- 不能解決任何缺點 (2)read committed -- 髒讀,Oracle預設 (3)reapatable read -- 不可重複讀,髒讀,MySQL預設 (4)serializable -- 幻讀,不可重複讀,髒讀,效率低 注意:jdbc/dbutils速度快,但書寫煩 mybaits速度中等,但書寫"中等" hibernate速度慢,但書寫"爽" Oracle支援的二種事務隔離級別及能夠解決的問題 Oracle支援:read committed 和 serializable Oracle中設定事務隔離級別為serializable set transaction isolation level serializable; 演示二個使用者同時操作emp表,刪除KING這條記錄,會有什麼後果? 因為有隔離級別的存在,所以不會出現二個使用者都刪除了KING這條記錄, 一定是一個使用者刪除KING成功,在該使用者沒有提交的情況下,另一個使用者等待 -------------------------------------------------------------------------------------訪問其它使用者下的物件 宣告:scott或hr叫使用者名稱/方案名/空間名 scott--tiger hr-----lion 查詢當前使用者是誰 show user; 查詢scott自己表空間下的所有物件時,可加,或不加使用者名稱select * from emp; select * from emp; 或 select * from scott.emp; 以sysdba身份解鎖hr普通帳戶 alter user hr account unlock; 以sysdba身份設定hr普通帳戶的密碼 alter user hr identified by lion; 當scott查詢hr表空間下的所有表時,必須得加使用者名稱 select * from hr.jobs; 在預設情況下,每個使用者只能查詢自已空間下的物件的許可權,不能查詢其它使用者空間下的物件 以sysdba身份角色,授予scott使用者查詢所有使用者空間下的物件許可權 grant select any table to scott; 以sysdba身份,撤銷scott使用者查詢所有使用者空間下的物件許可權 revoke select any table from scott; scott自已檢視自己所擁有的許可權 select * from user_sys_privs; 從scott使用者空間導航到sysdba使用者空間 conn / as sysdba; 從sysdba使用者空間導航到scott使用者空間 conn scott/tiger; 從scott使用者空間導航到hr使用者空間 conn hr/lion; 查詢hr使用者空間中的所有物件 select * from tab; 從hr使用者空間導航到scott使用者空間 conn scott/tiger; 在scott使用者空間下,查詢hr使用者空間下的jobs表,必須加上hr使用者空間名 select * from hr.jobs; -------------------------------------------------------------------------------------檢視 什麼是檢視【View】 (1)檢視是一種虛表 (2)檢視建立在已有表的基礎上, 檢視賴以建立的這些表稱為基表 (3)向檢視提供資料內容的語句為 SELECT 語句,可以將檢視理解為儲存起來的 SELECT 語句 (4)檢視向用戶提供基表資料的另一種表現形式 (5)檢視沒有儲存真正的資料,真正的資料還是儲存在基表中 (6)程式設計師雖然操作的是檢視,但最終檢視還會轉成操作基表 (7)一個基表可以有0個或多個檢視 什麼情況下會用到檢視 (1)如果你不想讓使用者看到所有資料(欄位,記錄),只想讓使用者看到某些的資料時,此時可以使用檢視 (2)當你需要減化SQL查詢語句的編寫時,可以使用檢視,但不提高查詢效率 檢視應用領域 (1)銀行,電信,金屬,證券軍事等不便讓使用者知道所有資料的專案中 檢視的作用 (1)限制資料訪問 (2)簡化複雜查詢 (3)提供資料的相互獨立 (4)同樣的資料,可以有不同的顯示方式 基於emp表所有列,建立檢視emp_view_1,create view 檢視名 as select對一張或多張基表的查詢 create view emp_view_1 as select * from emp; 預設情況下,普通使用者無權建立檢視,得讓sysdba為你分配creare view的許可權 以sysdba身份,授權scott使用者create view許可權 grant create view to scott; 以sysdba身份,撤銷scott使用者create view許可權 revoke create view from scott; 基於emp表指定列,建立檢視emp_view_2,該檢視包含編號/姓名/工資/年薪/年收入(查詢中使用列別名) create view emp_view_2 as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 基於emp表指定列,建立檢視emp_view_3(a,b,c,d,e),包含編號/姓名/工資/年薪/年收入(檢視中使用列名) create view emp_view_3(a,b,c,d,e) as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 查詢emp_view_3建立檢視的結構 desc emp_view_3; 修改emp_view_3(id,name,salary,annual,income)檢視,create or replace view 檢視名 as 子查詢 create or replace view emp_view_3(id,name,salary,annual,income) as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 查詢emp表,求出各部門的最低工資,最高工資,平均工資 select min(sal),max(sal),round(avg(sal),0),deptno from emp group by deptno; 建立檢視emp_view_4,檢視中包含各部門的最低工資,最高工資,平均工資 create or replace view emp_view_4 as select deptno "部門號",min(sal) "最低工資",max(sal) "最高工資",round(avg(sal),0) "平均工資" from emp group by deptno; 建立檢視emp_view_5,檢視中包含員工編號,姓名,工資,部門名,工資等級 create or replace view emp_view_5 as select e.empno "編號",e.ename "姓名",e.sal "工資",d.dname "部門名",s.grade "工資等級" from emp e,dept d,salgrade s where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal); 刪除檢視emp_view_1中的7788號員工的記錄,使用delete操作,會影響基表嗎 delete from emp_view_1 where empno=7788;寫法正確,會影響基表 修改emp_view_1為只讀檢視【with read only】,再執行上述delete操作,還行嗎? create or replace view emp_view_1 as select * from emp with read only; 不能進行delete操作了 刪除檢視中的【某條】記錄會影響基表嗎? 會影響基表 將【整個】檢視刪除,會影響表嗎? 不會影響基表 刪除檢視,會進入回收站嗎? 不會進入回收站 刪除基表會影響檢視嗎? 會影響檢視 閃回基表後,檢視有影響嗎? 檢視又可以正常工作了 -------------------------------------------------------------------------------------同義詞 什麼是同義詞【Synonym】 (1)對一些比較長名字的物件(表,檢視,索引,序列,。。。)做減化,用別名替代 同義詞的作用 (1)縮短物件名字的長度 (2)方便訪問其它使用者的物件 建立與salgrade表對應的同義詞,create synonym 同義詞 for 表名/檢視/其它物件 create synonym e for salgrade; create synonym ev5 for emp_view_5; 以sys身份授予scott普通使用者create synonym許可權 grant create synonym to scott; 以sys身份從scott普通使用者撤銷create synonym許可權 revoke create synonym from scott; 使用同義詞操作salgrade表 select * from s; 刪除同義詞 drop synonym ev5; 刪除同義詞,會影響基表嗎? 不會影響基表 刪除基表,會影響同義詞嗎? 會影響同義詞 -------------------------------------------------------------------------------------序列 什麼是序列【Sequence】 (1)類似於MySQL中的auto_increment自動增長機制,但Oracle中無auto_increment機制 (2)是oracle提供的一個產生唯一數值型值的機制 (3)通常用於表的主健值 (4)序列只能保證唯一,不能保證連續 宣告:oracle中,只有rownum永遠保持從1開始,且繼續 (5)序列值,可放於記憶體,取之較快 題問:為什麼oracle不直接用rownum做主健呢? rownum=1這條記錄不能永遠唯一表示SMITH這個使用者 但主鍵=1確可以永遠唯一表示SMITH這個使用者 為什麼要用序列 (1)以前我們為主健設定值,需要人工設定值,容易出錯 (2)以前每張表的主健值,是獨立的,不能共享 為emp表的empno欄位,建立序列emp_empno_seq,create sequence 序列名 create sequence emp_empno_seq; 刪除序列emp_empno_seq,drop sequence 序列名 drop sequence emp_empno_seq; 查詢emp_empno_seq序列的當前值currval和下一個值nextval,第一次使用序列時,必須選用:序列名.nextval select emp_empno_seq.nextval from dual; select emp_empno_seq.currval from dual; 使用序列,向emp表插入記錄,empno欄位使用序列值 insert into emp(empno) values(emp_empno_seq.nextval); insert into emp(empno) values(emp_empno_seq.nextval); insert into emp(empno) values(emp_empno_seq.nextval); 修改emp_empno_seq序列的increment by屬性為20,預設start with是1,alter sequence 序列名 alter sequence emp_empno_seq increment by 20; 修改修改emp_empno_seq序列的的increment by屬性為5 alter sequence emp_empno_seq increment by 5; 修改emp_empno_seq序列的start with屬性,行嗎 alter sequence emp_empno_seq start with 100; 有了序列後,還能為主健手工設定值嗎? insert into emp(empno) values(9999); insert into emp(empno) values(7900); 刪除表,會影響序列嗎? 你無法做insert操作 刪除序列,會影響表嗎? 表真正亡,序列亡 在hibernate中,如果是訪問oracle資料庫伺服器,那麼User.hbm.xml對映檔案中關於<id>標籤如何配置呢? <id name="id" column="id"> <generator class="increment/identity/uuid/【sequence】/【native】"/> </id> -------------------------------------------------------------------------------------索引 什麼是索引【Index】 (1)是一種快速查詢表中內容的機制,類似於新華字典的目錄 (2)運用在表中某個/些欄位上,但儲存時,獨立於表之外 為什麼要用索引 (1)通過指標加速Oracle伺服器的查詢速度 (2)通過rowid快速定位資料的方法,減少磁碟I/O rowid是oracle中唯一確定每張表不同記錄的唯一身份證 rowid的特點 (1)位於每個表中,但表面上看不見,例如:desc emp是看不見的 (2)只有在select中,顯示寫出rowid,方可看見 (3)它與每個表繫結在一起,表亡,該表的rowid亡,二張表rownum可以相同,但rowid必須是唯一的 (4)rowid是18位大小寫加數字混雜體,唯一表代該條記錄在DBF檔案中的位置 (5)rowid可以參與=/like比較時,用''單引號將rowid的值包起來,且區分大小寫 (6)rowid是聯絡表與DBF檔案的橋樑 索引的特點 (1)索引一旦建立, Oracle管理系統會對其進行自動維護, 而且由Oracle管理系統決定何時使用索引 (2)使用者不用在查詢語句中指定使用哪個索引 (3)在定義primary key或unique約束後系統自動在相應的列上建立索引 (4)使用者也能按自己的需求,對指定單個欄位或多個欄位,新增索引 什麼時候【要】建立索引 (1)表經常進行 SELECT 操作 (2)表很大(記錄超多),記錄內容分佈範圍很廣 (3)列名經常在 WHERE 子句或連線條件中出現 注意:符合上述某一條要求,都可建立索引,建立索引是一個優化問題,同樣也是一個策略問題 什麼時候【不要】建立索引 (1)表經常進行 INSERT/UPDATE/DELETE 操作 (2)表很小(記錄超少) (3)列名不經常作為連線條件或出現在 WHERE 子句中 同上注意 為emp表的empno單個欄位,建立索引emp_empno_idx,叫單列索引,create index 索引名 on 表名(欄位,...) create index emp_empno_idx on emp(empno); 為emp表的ename,job多個欄位,建立索引emp_ename_job_idx,多列索引/聯合索引 create index emp_ename_job on emp(ename,job); 如果在where中只出現job不使用索引 如果在where中只出現ename使用索引 我們提倡同時出現ename和job 注意:索引建立後,只有查詢表有關,和其它(insert/update/delete)無關,解決速度問題 刪除emp_empno_idx和emp_ename_job_idx索引,drop index 索引名 drop index emp_empno_idx; drop index emp_ename_job_idx;