存儲過程是:
通過一系列的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)