mysql數據庫之事務與存儲過程

事務python

什麼是事務?mysql

  事務是指一些SQL語句的集合,這些語句同時執行成功完成某項功能sql

事務的CAID特性:數據庫

  原子性:一個事務的執行是總體性的,要麼內部全部語句都執行成功,要麼一個都別想成功編程

  一致性:事務必須使數據庫從一個一致性狀態變到另外一個一致性狀態。併發

  隔離性:一個事務的執行不能夠被其餘事務干擾,一個事物內部語句執行不受併發的其餘操做影響,彼此相互隔離。編程語言

  持久性:事務的提交對數據庫的改變是永久性的,不受外部因素或其餘操做影響函數

事務的語法規則:工具

create table user(   id int primary key auto_increment,   name char(32),   balance int ); insert into user(name,balance) values ("zhangsan",1000), ("lisi",1000), ("wangwu",1000); # 下面產生事務操做 start transaction;   update user set balance = 900 where name = "zhangsan"; # 買家支付100元   update user set balance = 1010 where name = "lisi"; # 中介拿10元抽成   update user set balance = 1090 where name = "wangwu"; # 商家得90元 rollback; # 事務回滾 # 開啓事務以後,只要沒有執行commit操做,數據其實都沒有真正刷新到硬盤 commit; #開啓事務檢測操做是否完整,不完整主動回滾到上一個狀態,若是完整就應該執行commit操做

 

 

存儲過程優化

概念:存儲過程包含一堆sql語句,能夠經過對存儲過程的名字來調用執行內部語句,相似於其餘編程語言中的函數

存儲過程的

三種開發模型:

第一種:

    應用程序:只須要開發應用程序的邏輯

    mysql:事先編寫好存儲過程,供應用程序隨時調用

    優勢:開發效率和執行效率高

    缺點:人爲因素較多,跨部門溝通等,擴展性較差

第二種:  

    應用程序:除了要開發應用程序邏輯,還須要編寫原生的sql語句

    優勢:擴展性較高,都根據mysql語法規則來編寫sql語句便可

    缺點:編寫原生sql語句十分複雜,而且要考慮到sql語句優化的問題,這就致使了開發效率和執行效率下降的問題

第三種:

    應用程序:只考慮應用程序的邏輯,不須要管SQL語句的實現,基於第三方的工具和庫

    優勢:開發效率高,直接調用已封裝好的功能和方法就好,有更好的兼容性

    缺點:執行效率比較低,執行效率不如第二種

  

 

如何建立存儲過程:

# 存儲過程在那個庫下建立即在哪一個庫下面生效,不是全局的 # 1、直接在mysql中調用 set @res=10 # res的值是用來判斷存儲過程是否被執行成功的依據,因此須要先定義一個變量@res存儲10 call p1(2,4,10); # 報錯 call p1(2,4,@res); # 查看結果 select @res; # 執行成功,@res變量值發生了變化 # 2、在python程序中調用 pymysql連接mysql 產生的遊表cursor.callproc('p1',(2,4,10)) # 內部原理:@_p1_0=2,@_p1_1=4,@_p1_2=10; cursor.excute('select @_p1_2;') # 3、存儲過程與事務使用舉例(瞭解) delimiter //
create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN
  DECLARE exit handler for sqlexception   BEGIN
    -- ERROR
    set p_return_code = 1;     rollback;   END;   DECLARE exit handler for sqlwarning   BEGIN
    -- WARNING
    set p_return_code = 2;     rollback;   END;   START TRANSACTION;     update user set balance=900 where id =1;     pdate user123 set balance=1010 where id = 2;     pdate user set balance=1090 where id =3;   COMMIT;   -- SUCCESS
  set p_return_code = 0; #0表明執行成功 END // delimiter ;
相關文章
相關標籤/搜索