SQL Server如何对待事务处理存储过程中的语句?
技术问答
537 人阅读
|
0 人回复
|
2023-09-14
|
假设我有一个存储过程,该过程由几个单独的SELECT,INSERT,UPDATE和DELETE语句组成。没有明确的BEGIN TRANS / COMMIT! p% S6 \6 \. c0 _ s1 Z
TRANS / ROLLBACK TRANS逻辑。
9 G/ A9 x/ O( SSQL Server将如何以事务方式处理此存储过程?每个语句都会有隐式连接吗?还是存储过程会有一笔交易?
6 t9 g7 \% |0 [0 A* E另外,如何使用T-SQL和/或SQL Server Management Studio独自发现这一点?
: c$ V3 A$ l( A谢谢!
% S1 L! I9 v. S9 {5 S( R
' f, c2 I' G, Q5 }% W; k ]8 w解决方案:" F P% z: w9 j; F& W6 E" k. z
% o$ F8 ?$ V, y% N6 T+ K& t
, Y: A; z& k' Y+ o
+ `% q3 q8 q' ~0 @3 m 无论存储过程中有多少个SQL命令,都将只有一个连接,它是用于运行过程的连接。- _2 U \2 \8 y D- N; c8 f* v
由于您在存储过程中没有显式的BEGIN TRANSACTION,因此每个语句将独立运行,如果有任何错误,将无法回滚任何更改。
' U# S: _/ E& Q* y/ q4 C7 M$ T但是,如果在调用存储过程之前发出了BEGIN TRANSACTION,则所有语句都将在事务中分组,并且可以在存储过程执行后被提交或回滚。0 V. k) \6 e+ C- [! |- U
在存储过程中,可以通过检查系统变量@@ TRANCOUNT(Transact-SQL)的值来确定您是否在事务中运行。零表示没有事务,其他任何东西都表明您处于多少嵌套级别。根据您的SQL
! K! S9 H4 b$ \8 g$ P# DServer版本,您也可以使用XACT_STATE(Transact-SQL)。9 f! D' [. _$ |5 O
如果您执行以下操作:
1 h. L7 V5 R9 o# v1 C+ Z5 pBEGIN TRANSACTION
( h3 B& O/ N& ^0 YEXEC my_stored_procedure_with_5_statements_inside @Parma1
# c5 p+ X' Z, h2 x$ F( oCOMMIT
% j, I& E1 _. `, L7 r事务覆盖了过程中的所有内容,所有6条语句(EXEC是事务覆盖的语句,1 + 5 = 6)。如果您这样做:1 Y0 M6 f$ R3 R2 L
BEGIN TRANSACTION
5 Y; a6 [. `1 M' {6 }8 w& G. yEXEC my_stored_procedure_with_5_statements_inside @Parma1: F+ F7 x" o2 a) H7 E
EXEC my_stored_procedure_with_5_statements_inside @Parma15 V0 p& L: u" M q4 ^# b
COMMIT8 l7 E+ P1 ^: ^4 H( u$ C4 E
两个过程调用中的所有内容都被事务覆盖,所有12条语句(两个EXEC都被事务覆盖,1 + 5 + 1 + 5 = 12)。 |
|
|
|
|
|