Java EE day05學習總結

今天主要學習數據的存儲過程和事務

思維導圖:

一.存儲過程

1.什麼是存儲過程?

所謂的存儲過程就是一組SQL組成的邏輯語句,這個存儲你可以理解爲一個對象體,這個過程會持久的保存在我們數據庫的服務器端,效率非常高。

2.存儲過程的特點:

(1)存儲過程是保存在我們的服務器端,我們只要通過客戶端一次調用語句,就可以執行服務器端事先準備好的SQL語句,所有的過程是服務器端一次性完成,所以下效率非常高

(2)存儲過程跟我們之前編寫的SQL語句不一樣,當創建語句部分依賴的DDL語言。

3.存儲過程的移植性的非常差(幾乎無法移植)

創建無參存儲過程

CREATE PROCEDURE 函數名(參數列表)

BEGIN

    -- 寫上存儲過程需要執行的SQL或者代碼

END

---

CREATE PROCEDURE test()

BEGIN

    SELECT * FROM emp WHERE;

END

4.存儲過程的參數類別

(1)輸出參數:OUT
(2) Mysql的三大變量

<1>全局變量,也被稱之爲MYSQL的默認變量,屬於配置級變量,這個變量一旦設定好,只有在你的Mysql完全停止服務的時候纔會失效

character_set_client:mysql能夠從客戶端接收什麼樣的字符集編碼

character_set_results:服務端返回給客戶端的字符集編碼

* 如何查看全局變量?

 ```

    SELECT @@變量名;

    SELECT @@character_set_client;

   ```

* 修改(定義)全局變量:

  ``` 

    SET @@變量名 = 值;

    SET @@character_set_client = 'gbk';   

    ```

<2>會話變量,只在一次連接會話中有效,會話關閉則變量失效。

如何查看會話變量?

SELECT @變量名;

SELECT @character_set_client;

<3>修改(定義)會話變量:

SET @變量名 = 值;

SET @character_set_client = 'gbk';   

<4>局部變量,只在一次存儲過程當中有效,外界無法使用,存儲過程完畢,局部變量失效。

如何查看局部變量?

SELECT 變量名;

SELECT character_set_client;

<5>修改(定義)局部變量:

SET 變量名 = 值;

SET character_set_client = 'gbk';   

<6>定義局部變量:

declare 變量名  數據類型

二.事務

1.什麼事務?

在我們的實際開發當中,很多的業務的操作,往往不單單只是一條SQL可以完成的,必須要兩條甚至多條SQL才能完成一個業務。比如轉賬,一個用戶表,兩個用戶,A用戶給B用戶進行轉賬1000,則A用戶的餘額的要進行-1000,而B用戶的餘額+1000。那麼這種操作其實最少需要兩條SQL,如果說在兩個SQL之間產生了異常,那麼就會操作A用戶的餘額已經減少,而B用戶的餘額沒有變化,這麼種情況就需要依靠事務進行處理,要麼同時成功、要麼同時失敗,中間連續不可中斷。

2.如何操作事務?

(1)開啓語句的事務:START TRANSACTION;

  (2)回滾語句的事務:ROLLBACK;

 (3)提交語句的事務:COMMIT;

3.Mysql的事務的提交方式

(1)自動提交(Mysql默認)

所有的代碼執行完畢之後,不需要手動干預 自動提交

一條DML語句操作,其實一個事務的產生

(2)手動提交(Oracle默認)

每一個(DML)的代碼操作,都需要自己手動處理

必須要處理COMMIT操作,代碼纔會成功

(3)修改Mysql的事務提交方式

查看當前配置的事務提交方式

SELECT @@autocommit;

修改事務的提交方式

SET @@autocommit = 0;(0手動提交/1自動提交)

4.事務的四大特徵

(1)事務的原子性:事務的操作是一個不可分割的單位,從執行開始到結束,不允許任何的干擾中斷,要麼同時成功,要麼同時失敗

(2)事務的持久性:當我們的事務語句,不管是回滾還是提交,那麼一旦操作之後,這個數據應該恆久不變,持續的。

(3)事務的隔離性:多個事務之間因爲不同的隔離級別,所受到的影響是互相獨立的。

(4)事務的一致性:你的事務操作之前的數據,和事務回滾或者提交之後是數據,數據的總量應該是保持一致的。

5.事務的隔離級別:

(1)什麼是隔離級別?

多個事務的操作,每一個事務之間都是獨立運作的。但是如果多個事務是操作同一個(批)數據的時候,會引發一堆的隔離的問題

<1>髒讀:,當多個事務,操作同一個數據的時候,A事務可能讀到了B事務沒有提交數據。

<2> 虛讀(不可重複讀):在同一個事務當中,兩次讀取到的數據是不一致的。

<3> 幻讀:(Mysql不存在這個問題)

(2)什麼是隔離級別

<1>READ UNCOMMITTED:未讀提交

這個級別產生的問題:髒讀、虛讀、幻讀問題

<2>READ COMMITTED:讀以提交(Oracle默認)

這個級別產生的問題:虛讀、幻讀問題

<3>REPEATABLE READ:可重複讀(Mysql默認)

這個級別產生的問題:幻讀問題

<4>SERIALIZABLE:串行化

可以解決所有問題

注意:隔離級別從小到大,安全性也是從小到大,但是效率是從大到小。

6.設置Mysql的隔離級別:

(1)數據庫查詢隔離級別:

Linux:select @@transaction_isolation;

Windows: select@@tx_isolation; 

(2)數據庫設置隔離級別:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ '隔離隔離名';

 

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