mysql的存儲過程與事務入門


存儲過程是:
通過一系列的SQL語句, 根據傳入的參數(也可以沒有), 通過簡單的調用, 
完成比單個SQL語句更復雜的功能, 存儲在數據庫服務器端,只需要編譯過一次之后再次使用都不需要再進行編譯。主要對存儲的過程進行控制。

事務是一系列的數據更改操作組成的一個整體。一旦事務中包含的某操作失敗或用戶中止,用戶可以控制將事務體中所有操作撤消,返回事務開始前的狀態。
事務中的操作是一個整體,要么整體完成,要么全部不做。從而保證了數據的完整性。
Mysql中,MyISAM存儲引擎不支持事務,InnoDB支持。

兩者都是數據庫中非常重要的知識。

 

一、存儲過程

創建一張test1表的存儲過程
mysql> delimiter $ -- delimiter $是設置 $為命令終止符號,代替默認的分號,因為分號有其他用處.
mysql> create procedure sp_test1()
-> begin
-> create table test1(id int,name varchar(100));
->insert into test1 values(1,'lilei');
-> select * from test1;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; //恢復分號作為分隔終止符號

調用存儲過程
mysql> call sp_test1();



創建帶參數的存儲過程
mysql> delimiter $ -- delimiter $是設置 $為命令終止符號,代替默認的分號,因為分號有其他用處.
mysql> create procedure sp_test(IN pi_id int, OUT po_name varchar(10))
-> begin
-> select * from test.tb_test;
-> select tb_test.name into po_name from test.tb_test where tb_test.id = pi_id;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; -- 恢復分號作為分隔終止符號

5.調用存儲過程
mysql> set @po_name='';
Query OK, 0 rows affected (0.00 sec)
mysql> call sp_test(1,@po_name);

  

 

二、事務處理

mysql中如果是不支持事務的引擎,如myisam,則是否commit都沒有效的。

如果是支持事務的引擎,如innodb,則有系統參數設置是否自動commit,查看參數如下:
mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)

mysql>

顯示結果為on表示事務自動提交,也即不用手工去commit。
當然,你可以設置其為OFF,然后自己手工去commit。

使用了commit后你不可以回退,它會永久改變你的數據,而不使用只是臨時改變,它把改變后的內容備份了一份在日志中,你可以rollback還原回來,看情況而用了。

PHP中使用事務實例

<?php
$handler=mysql_connect("localhost","root","password");
mysql_select_db("task");
mysql_query("SET AUTOCOMMIT=0");//設置為不自動提交,因為MYSQL默認立即執行
mysql_query("BEGIN");//開始事務定義
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROLLBACK");//判斷當執行失敗時回滾
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROLLBACK");//判斷執行失敗回滾
}
mysql_query("COMMIT");//執行事務
mysql_close($handler);
?>

  

Mysql控制台事務處理

mysql> use test;
Database changed
mysql> CREATE TABLE `dbtest`(
     -> id int(4)
     -> ) TYPE=INNODB;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> select * from dbtest
     -> ;
Empty set (0.01 sec)

mysql> begin;  //開啟事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dbtest value(5);//插入數據,表中數據臨時改變,可回滾
Query OK, 1 row affected (0.00 sec)

mysql> insert into dbtest value(6);//插入數據,表中數據臨時改變,可以回滾
Query OK, 1 row affected (0.00 sec)

mysql> commit;   //提交,表中臨時數據不可回滾
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dbtest;
+------+
| id    |
+------+
|     5 |
|     6 |
+------+
2 rows in set (0.00 sec)

mysql> begin;  //開啟事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dbtest values(7);  //插入數據,表中數據臨時改變
Query OK, 1 row affected (0.00 sec)

mysql> rollback;   //回滾到事務開始前數據
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dbtest;
+------+
| id    |
+------+
|     5 |
|     6 |
+------+
2 rows in set (0.00 sec)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM