事务处理
动作
开始事务:start transaction
提交事务:commit
回滚事务:rollback
设置自动提交:set autocommit 1 | 0
autoCommit系统默认是1立即提交模式;0手动控制事务。
Eg:
start transaction;
select @result :=avg(age) from temp;
update temp set age = @result where id = 2;
select * from temp where id = 2;//值被改变
rollback;//回滚
select * from temp where id = 2;//变回来了
不能回滚的语句
有些语句不能被回滚,比如创建或取消数据库的语句、创建取消或更改表或存储的子程序的语句
设计事务时,不应该包含这类语句。
如果在事务的前部中分布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布rollback语句不能回滚事务的全部效果。
一些操作也会隐式的提交事务
如:alter, create, drop, rename table, lock table, set autocommit, start transaction, truncate table等等,在事务中出现这些语句也会提交事务的。
事务不能嵌套事务
事务的保存点
savepoint pointName/Rollback to savepoint pointName
一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的操做。
如果有后面的保存点和前面的同名,则删除前面的保存点。
release savepoint会删除一个保存点,如果在一段事务中执行commit或rollback,则事务结束,所以保存点删除。
二、 存储过程
系统存储过程
从系统表中查询信息或完成与更新数据库表相关的管理任务或其它的系统管理任务。
系统存储过程主要存储在master数据库,以"sp"下划线开头的存储过程。
常用系统存储过程
exec sp_databases; --查看数据库
exec sp_tables; --查看表
exec sp_columns student; --查看列
exec sp_helpIndex student; --查看索引
exec sp_helpConstraint student; --约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures'; --查看存储过程创建、定义语句
exec sp_rename student, stuInfo; --修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB; --更改数据库名称
exec sp_defaultdb 'master', 'myDB'; --更改登录名的默认数据库
exec sp_helpdb; --数据库帮助,查询数据库信息
exec sp_helpdb master;
系统存储过程示例
--表重命名
exec sp_rename 'stu', 'stud';
select * from stud;
--列重命名
exec sp_rename 'stud.name', 'sName', 'column';
exec sp_help 'stud';
--重命名索引
exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
exec sp_help 'student';
--查询所有存储过程
select * from sys.objects where type='P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
自定义存储过程
1、创建语法
create proc | procedure pro_name
[
{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
创建不带参数存储过程:
1 //创建存储过程
2 create procedure get(out result int)
3 begin
4 select max(age) into result from temp;
5 end
6 //调用存储过程
7 call get(@temp);
8 //查询结果
9 select @temp;
10 //删除存储过程
11 drop procedure get;
12 //查看存储过程创建语句
13 show create procedure get;
//select....into 可以完成单行记录的赋值
create procedure getRecord(sid int)
begin
declare v_name varchar(20) default 'jason';
declare v_age int;
declare v_sex bit;
select name, age, sex into v_name, v_age, v_sex from temp where id = sid;
select v_name, v_age, v_sex;
end;
call getRecord(1);
创建带参存储过程
create proc proc_find_stu(@startId int, @endId int)
as
select * from student where id between @startId and @endId
go
exec proc_find_stu 2, 4;
带输出参数存储过程
create proc proc_getStudentRecord(
@id int, --默认输入参数
@name varchar(20) out, --输出参数
@age varchar(20) output--输入输出参数
)
as
select @name = name, @age = age from student where id = @id and sex = @age;
go
--
declare @id int,
@name varchar(20),
@temp varchar(20);
set @id = 7;
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name + '#' + @temp;