MSSQL Transaction[事务] and Procedure[存储过程]

  1 --事务分三种
  2 --1.显示事务
  3 --我们手动begin transaction ...... commit transaction/rollback transaction
  4 --上面这种写法叫做“显示事务”
  5
  6 --2.隐式事务
  7 SET IMPLICIT_TRANSACTIONS { ON | OFF }隐式事务
  8
  9
 10 --3.自动提交事务,SQL Server默认使用的是自动提交事务.
 11 --我们每次执行一条sql语句的时候,sql server都会自动帮我们打开一个事务
 12 --如果该sql语句执行不出错,则sql server自动提交该事务commit
 13 --如果该sql语句执行出错了,那么sql server则自动回滚该事务。rollback
 14
 15 --1:创建第一个简单的存储过程
 16  CREATE PROC usp_helloworld
 17  AS
 18  BEGIN
 19     PRINT ‘hello world!‘
 20  END
 21
 22  EXEC usp_helloworld
 23
 24  --2:带参数的存储过程
 25 CREATE PROC usp_showmsg
 26 @msg nvarchar(300)  ---多个参数使用,隔开。
 27 AS
 28 BEGIN
 29     PRINT @msg
 30 END
 31
 32
 33  EXEC usp_showmsg N‘XXX‘
 34
 35  EXEC usp_showmsg @msg=N‘11111111111‘
 36
 37
 38
 39  --3:简单的加法存储过程
 40  CREATE PROC usp_add
 41  @n int,
 42  @m int
 43  AS
 44  BEGIN
 45     PRINT @n+@m
 46  END
 47
 48  EXEC usp_add 100,200
 49
 50  DROP PROC usp_add
 51
 52 --4:带默认值的存储过程
 53 ALTER PROC usp_add
 54 @num1 int = 100,  --为参数加默认值
 55 @num2 int = 200
 56 AS
 57 BEGIN
 58     PRINT @num1 + @num2
 59 END
 60
 61
 62
 63 --5:部分带默认值的存储过程
 64 ALTER PROC usp_add
 65 @num1 int = 100,  --为参数加默认值
 66 @num2 int
 67 AS
 68 BEGIN
 69     PRINT @num1 + @num2
 70 END
 71
 72 exec usp_add @num2=50
 73
 74 --6:存储过程中的输出参数
 75 SELECT * FROM TblStudent
 76
 77 ALTER PROC usp_selectByAge
 78 @age int,
 79 @count int OUTPUT  -- 输出参数
 80 AS
 81 BEGIN
 82     --1. 根据@age进行查询
 83     SELECT * FROM TblStudent where tSAge>@age
 84
 85     --2.返回一共查询出了多少条数据
 86     SET @count=(SELECT COUNT(*) FROM TblStudent where tsage>@age)
 87 END
 88
 89
 90 DECLARE @c int
 91 EXEC usp_selectByAge @age=20,@count=@c OUTPUT
 92 PRINT @c
 93
 94
 95 --7:经典写法:转账使用存储过程来编写
 96 --存储过程
 97 CREATE PROC usp_transfer
 98 @from char(4),
 99 @to char(4),
100 @money money,
101 @state bit OUTPUT --1表示转账成功,0表示转账失败!
102 AS
103 BEGIN
104     DECLARE @balance money,@sum int=0
105     SET @state=0
106     --1.查询@from中的余额
107     SET @balance=(SELECT balance FROM bank WHERE bank.cId=@from)
108     --2.检查余额是否充足
109     IF @balance-@money>10 BEGIN
110         ----3.开始事务进行转账
111         --打开事务
112         BEGIN TRANSACTION
113             --1.减钱
114             UPDATE bank SET balance=bank.balance-@money where bank.cId=@from
115             SET @sum=@sum+@@error
116             --2.加钱
117             UPDATE bank SET balance=bank.balance+@money where bank.cId=@to
118             SET @sum=@sum+@@error
119
120             IF @sum=0 BEGIN
121                 SET @state=1 --设置转账成功
122                 COMMIT TRAN
123             END
124             ELSE
125                 ROLLBACK TRAN
126
127     END
128 END
129 --调用存储过程
130 DECLARE @ok bit
131 EXEC usp_transfer @from=‘0002‘,@to=‘0001‘,@money=800,@state=@ok OUTPUT
132 SELECT @ok
133
134 SELECT * FROM bank
135
136
137
138 --8:经典:分页存储过程
139 SELECT * FROM Customers order by Customers.CustomerID asc
140
141 --创建存储过程
142 --参数:
143     --每页大小pagesize
144     --当先用户要查看第几页
145     --总页数
146     --总条数
147 CREATE PROC usp_get_customers_by_page
148 @pagesize int=5, --每页多少条
149 @pageindex int=1,  --用户当前要看第几页
150 @recordcount int OUTPUT, --总记录条数,输出参数
151 @pagecont int OUTPUT     --总页数,输出参数
152 AS
153 BEGIN
154     --1. 分页查询语句
155     SELECT
156         T.CustomerID,
157         T.CompanyName,
158         T.City,
159         T.[Address],
160         T.Phone
161     FROM (SELECT *,rn=ROW_NUMBER()OVER(ORDER by CustomerID ASC) FROM Customers) AS T
162     WHERE T.rn BETWEEN @pagesize*(@pageindex-1)+1 and @pagesize*@pageindex
163
164     --2.返回总条数
165     SET @recordcount=(SELECT COUNT(*) FROM Customers)
166
167     --3.计算总页数,并返回
168     SET @pagecont=CEILING(@recordcount*1.0/@pagesize);
169 END
170
171 --调用存储过程
172 DECLARE @pc int,@rc int
173 EXEC usp_get_customers_by_page 7,13,@rc OUTPUT,@pc OUTPUT
174 PRINT @pc
175 PRINT @rc
176
177
178
179 --9:增删改查:存储过程
180 --insert
181 CREATE PROC usp_insert_newperson
182 @name nvarchar(50),
183 @age int
184 AS
185 BEGIN
186     INSERT into NewPerson VALUES(@name,@age)
187 END
188 ------------------------------
189 --delete
190 CREATE PROC usp_delete_newperson
191 @autoId int
192 AS
193 BEGIN
194     DELETE from NewPerson where NewPerson.autoId=@autoId
195 END
196 ------------------------------
197 --update
198 CREATE PROC usp_update_newperson
199 @autoId int,
200 @name nvarchar(50),
201 @age int
202 AS
203 BEGIN
204     UPDATE NewPerson set uName=@name,age=@age WHERE NewPerson.autoId=@autoId
205 END
206 ---------------------------------------
207 --select
208 CREATE PROC usp_select_newperson
209 AS
210 BEGIN
211     SELECT * FROM NewPerson
212 END
213 -------------------------------------
214 CREATE view vw_newperson
215 AS
216     SELECT * FROM NewPerson
217
218
219 --10:其它-----
220 SELECT * FROM Contacts
221 SELECT * FROM deleted
222
223 INSERT into NewPerson (NewPerson.uName,age)
224 OUTPUT INSERTED.autoId  VALUES(‘王子斌‘,20)
225
226 ----inserted-------------------    deleted-----------------------
227
228 SELECT * FROM Customers
229
230 DELETE from Customers where Customers.CustomerID=‘CHOPS‘
231
232
233 SELECT TOP 0 * INTO CustomersBak FROM Customers
234
235 SELECT * FROM CustomersBak
236
237 ALTER TRIGGER tri_customers_after_delete ON Customers
238 AFTER DELETE
239 AS
240 BEGIN
241     INSERT INTO CustomersBak SELECT * FROM DELETED
242 END
243
244 SELECT * FROM Customers
245
246
247 DELETE from Customers where Customers.CustomerID IN(‘CACTU‘,‘CENTC‘,‘ERNSH‘)
248
249
250
251 CREATE TABLE A20140222 ( A VARCHAR(10))
252
253
254 DECLARE @SQL varchar(500)
255 SET @SQL=‘CREATE TABLE T_‘+CONVERT(VARCHAR(10),GETDATE(),112)+‘ ( A VARCHAR(10))‘
256 PRINT @SQL
257 EXEC(@SQL )
258
259 PRINT CONVERT(VARCHAR(10),GETDATE(),112)
260
261
262
263
264
265  
时间: 2024-12-25 02:16:00

MSSQL Transaction[事务] and Procedure[存储过程]的相关文章

Procedure 存储过程

本文非原创 存储过程是数据库当中最高级的应用程序,可以传递参数和返回相应的值. 1.分为:系统存储过程和自定义存储过程 定义:它是由一系列的预编译的SQL语句和流程控制语句组成的, 具有参数的传递.条件的判断.变量的声明.返回处理结果, 并扩充了SQL语句的功能. 优点:(1)使用它可以比单独使用SQL语句实现更复杂的功能. (2)它的执行速度要比普通的SQL语句执行的速度要快. 缺点:(1)不能实现复杂的逻辑操作,因为它不能提供复杂的程序设计. (2)存储过程创建后,管理较困难,需要记住每个过

oracle procedure存储过程

1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS/AS 变量1 INTEGER :=0; 变量2 DATE: BEGIN . . . END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列(字段)存储到多个变量中,必须有一条记录,否则抛出异常(如果没有记录,抛出NO_DATA_FOUND) 例子: BEGIN SELECT

Oracle job procedure 存储过程定时任务(转自hoojo)

Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * from user_jobs; -- 查询字段描述 /* 字段(列) 类型 描述 JOB NUMBER 任务的唯一标示号 LOG_USER VARCHAR2(30) 提交任务的用户 P

Transaction事务注解和DynamicDataSource动态数据源切换问题解决

问题描述: 写主库开事务的情况下会导致时不时的将更新/插入操作写入到从库上, 导致mysqlException 问题原因: jetty的工作队列会重用处理线程, 导致threadLocal被重用, 然而transaction注解在service层, 他会在DynamicDataSourceSwitch被设置之前直接去threadlocal拿数据, 本应拿到null, 但是拿到了之前线程的值 一般代码调用链: [email protected](AOP)-->DefaultSqlSession--

【转】Oracle job procedure 存储过程定时任务

原文:Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * from user_jobs; -- 查询字段描述 /* 字段(列) 类型 描述 JOB NUMBER 任务的唯一标示号 LOG_USER VARCHAR2(30) 提交任务的用

Spring Transaction 事务模拟

事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败. 事务有四个特性: Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性) Spring对事务的支持很强大,但是从本质上来说,事务是否生效取决于数据库底层是否支持(MySQL的MyISAM引擎不支持事务), 同时,一个事务的多个操作需要在同一个connection上.下面手写一个Demo分析Spring事务底层实现. 工程结构 connection

MySql 中游标,事务,终止存储过程方法总结

最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到游标,事务的处理.问题并不困难,只是容易忘记,做了一下总结: DECLARE err INT DEFAULT 0;#声明一个整形变量err,默认值是0 DECLARE orderDone INT DEFAULT FALSE;-- 遍历游标结束标识 DECLARE cur_order CURSOR F

MSSQL数据库 事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解 脏读 .不可重复读 .幻读 这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景

Spring transaction事务之roll back回滚

转自:http://blog.csdn.net/lovejavaydj/article/details/7635848 试验方法: 写一个单元测试,调用一个service层方法(发生对数据库进行写操作的方法--insert.update.delete)即可. 试验过程: 定义一个service方法如下: public SMSTiming createSMSTiming(SMSTiming smsTiming){ SMSTiming s= this.getSmsTimingDAO().create