mysql的存储过程与事务_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中使用事務實例
$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)
總結
以上是生活随笔為你收集整理的mysql的存储过程与事务_mysql的存储过程与事务入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钉钉订烟怎么看下次能订多少烟?
- 下一篇: win10 配置 maven_home