1. 程式人生 > 其它 >mysql事務、觸發器、儲存過程

mysql事務、觸發器、儲存過程

一、mysql事務

 

資料庫中的事務是指對資料庫執行一批操作,在同一個事務當中,這些操作最終要麼全部執行成功,要麼全部失敗,不會存在部分成功的情況。
MySQL 事務主要用於處理操作量大,複雜度高的資料。

 

  事物的幾個特徵:原子性、一致性、隔離性、永續性。

  (1).原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  (2).一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。

  (3).隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。

  (4).永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

 事物的操作: 

  開啟事務:start transaction;

  回滾:rollback;

  提交:commit;

注意:事務的執行過程如下,以 begin 或者 start transaction 開始,然後執行一系列操作,最後要執行 commit 操作,事務才算結束。當然,如果進行回滾操作(rollback),事務也會結束。

 

二、觸發器

  觸發器:在指定表上,(insert(插入)、update(修改)、delete(刪除))事件動作,觸發(After(之後)時機,Before(之前)),執行指定的一群或一個sql語句

#建立觸發器
DELIMITER $
CREATE TRIGGER ins_stu AFTER INSERT ON student FOR EACH ROW BEGIN INSERT INTO cj1( NUMBER,stu_id,stu_name,math,chinese,english )VALUES(1,new.stuid,new.username,88
,88,88); END $ DELIMITER ; INSERT INTO student(username,PASSWORD,birthday) VALUES('張三','321321','2016-08-23');

上述例項表示:當在ins_stu表每插入資料時會自動觸發執行begin後的sql語句,其中new.stuid和new.username是插入ins_stu表資料時的id和姓名

三、儲存過程

 

儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。

 

儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。

 

儲存過程思想上很簡單,就是資料庫 SQL 語言層面的程式碼封裝與重用。

#建立儲存過程
DELIMITER $
CREATE PROCEDURE test1()
BEGIN
    SELECT * FROM student;
    SELECT * FROM cj;
    UPDATE student SET PASSWORD='456456' WHERE username='李四';
END $
DELIMITER ;
#呼叫儲存過程call CALL test1(); DELIMITER $
CREATE PROCEDURE test2() BEGIN #宣告變數型別declare DECLARE un VARCHAR(32) DEFAULT''; #給un變數賦值 SET un='xiaoxiao'; #將查詢結果賦值給un變數 SELECT username INTO un FROM student WHERE stuid=3; #查詢un變數 SELECT un; END $ DELIMITER ; CALL test2(); DELIMITER $ CREATE PROCEDURE test2() BEGIN BEGIN #宣告變數型別declare DECLARE un VARCHAR(32) DEFAULT''; #給un變數賦值 SET un='xiaoxiao'; #將查詢結果賦值給un變數 SELECT username INTO un FROM student WHERE stuid=3; #查詢un變數 SELECT un; END; BEGIN #宣告變數型別declare DECLARE un2 VARCHAR(32) DEFAULT''; #給un變數賦值 SET un2='xiaoxiao'; #將查詢結果賦值給un變數 SELECT username INTO un2 FROM student WHERE stuid=5; #查詢un變數 SELECT un2; END; END $ DELIMITER ; CALL test2();