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