diff --git "a/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/11-9.21\346\255\273\351\224\201.Markdown" "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/11-9.21\346\255\273\351\224\201.Markdown" new file mode 100644 index 0000000000000000000000000000000000000000..24fa2a5a3d6d9b316218c1ce9c1d4a7928d40f7e --- /dev/null +++ "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/11-9.21\346\255\273\351\224\201.Markdown" @@ -0,0 +1,28 @@ +# 死锁 +### 什么是死锁 +A事务和B事务需要使用资源1,2,但是A事务占用了资源1,B事务占用了资源2,两个事务同时等待对方资源释放。 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。 + +### sql server死锁表现一: + + 一个用户A 访问表A(锁住了表A),然后又访问表B。    + 另一个用户B 访问表B(锁住了表B),然后企图访问表A,    + 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续,这就造成死锁了。 + + sql server死锁解决方法:    + 这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法    + 仔细分析你程序的逻辑, + 1:尽量避免同时锁定两个资源    + 2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. + +### sql server死锁表现二: + + 用户A读一条纪录,然后修改该条纪录。    + 这时用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释    + 放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。    + 这种死锁比较隐蔽,但其实在稍大点的项目中经常发生 + + + sql server死锁解决方法:    + 让用户A的事务(即先读后写类型的操作), + 在select 时用Update lock 语法如下:    + select * from table1 with(updlock) where .... \ No newline at end of file diff --git "a/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/12-9.26\345\255\230\345\202\250\350\277\207\347\250\213.Markdown" "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/12-9.26\345\255\230\345\202\250\350\277\207\347\250\213.Markdown" new file mode 100644 index 0000000000000000000000000000000000000000..d1650d0025eadc6a034771d006865f5cb7821c15 --- /dev/null +++ "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/12-9.26\345\255\230\345\202\250\350\277\207\347\250\213.Markdown" @@ -0,0 +1,146 @@ +# 存储过程 +### 什么是存储过程 +存储过程是**预编译**SQL语句集合,这些语句存储在一个名称(存储过程的名称)下并作为单元来处理。存储过程代替了传统的逐条执行SQL语句的方式,一个存储过程中可以包含查询、插入、删除、更新等操纵的一系列SQL语句,当这个存储过程被调用执行时,这些操作也会同时执行。 + +## 分类 +#### 1、系统存储过程 +以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。 +#### 2、本地存储过程 +用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。 +#### 3、临时存储过程 +分为两种存储过程: +一是本地临时存储过程 +二是全局临时存储过程 +#### 4、远程存储过程 +#### 5、扩展存储过程 +## 创建存储过程 +### 创建存储过程 +```sql +create procedure sp_name +@[参数名] [类型],@[参数名] [类型] +as +begin +......... +end +以上格式还可以简写成: +create proc sp_name +@[参数名] [类型],@[参数名] [类型] +as +begin +......... +end +--注:“sp_name”为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头 +``` +**执行存储过程格式** + +```sql +--无参 +exec <存储过程名称> +--带参 +exec <存储过程名称> <形参1>,<形参2>,... +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +``` +### 调用存储过程 +存储过程可以在三种环境下被调用: + + command命令下,基本语法为:exec sp_name [参数名]; + SQL环境下,基本语法为:call sp_name [参数名]; + PL/SQL环境下,基本语法为:begin sp_name [参数名] end; + +### 删除存储过程 +1.基本语法: +```sql +drop procedure sp_name +``` +2.注意事项 +(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 +### 其他常用命令 +```sql +show procedure status +--显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等 +show create procedure sp_name +--显示某一个mysql存储过程的详细信息 +exec sp_helptext sp_name +--显示你这个sp_name这个对象创建文本 +``` +## 四种存储过程 + +1.没有输入参数,没有输出参数的存储过程。 + +```sql +create proc <存储过程名称> +as + +go +``` + +练习: 定义存储过程查询 年龄最小的学生信息 + +2.有输入参数,没有输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +go +``` + + + + + +3.有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数)。 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +return 整数 +go +``` + + + +4.有输入参数,有输出参数的存储过程 & 一个变量具备同时输入输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> output +<变量2> <数据类型> output +... +as + +return 整数 +go +``` + + +#### 存储过程的优点 + 允许模块化程序设计 + 执行速度更快 + 减少网络流通量 + 提高系统安全性 + + + +#### 存储过程与函数的区别 + 1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + 2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + 3.储存过程可以输入输出参数,而函数只可以输入参数。 + 4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + 5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + 6.函数可以作为条件在语句中使用,但是存储过程不可以。 \ No newline at end of file