高级问题:如何在一个触发器或者存储过程中得知自己是否处在一个事务之中?

spotboy 2003-12-02 09:17:40
我现在正在写一个触发器,需要知道这个触发器的执行是否是包含在一个事务之中,能否得到这个事务的事务编号?

...全文
73 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
spotboy 2003-12-02
  • 打赏
  • 举报
回复
但是这个只是知道当前的活动事务,是否可以在一个数据库的范围内确切知道何时一个事务已经启动,何时一个事务已经结束呢?
shuiniu 2003-12-02
  • 打赏
  • 举报
回复
每次进入触发器,@@TRANCOUNT 就增加 1,即使在自动提交模式下也是如此。(系统将触发器视作隐性嵌套事务。)

zarge 2003-12-02
  • 打赏
  • 举报
回复
@@TRANCOUNT
返回当前连接的活动事务数。

语法
@@TRANCOUNT

返回类型
integer

注释
BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。

示例
下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = 'White'
IF @@ROWCOUNT = 2
COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
PRINT 'A transaction needs to be rolled back'
ROLLBACK TRAN
END

shuiniu 2003-12-02
  • 打赏
  • 举报
回复
触发器应该是嵌套事务!
sdhdy 2003-12-02
  • 打赏
  • 举报
回复
触发器可以说是一个比较特殊的事务吧!
realgz 2003-12-02
  • 打赏
  • 举报
回复
实验过了,确实返回的是触发器的事务号。
zjcxc 2003-12-02
  • 打赏
  • 举报
回复
如果是触发器中处理,那就肯定是事务中

因为触发器本身就是一个事务.
zjcxc 2003-12-02
  • 打赏
  • 举报
回复
@@TRANCOUNT
返回当前连接的活动事务数。

语法
@@TRANCOUNT

返回类型
integer

注释
BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。

示例
下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = 'White'
IF @@ROWCOUNT = 2
COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
PRINT 'A transaction needs to be rolled back'
ROLLBACK TRAN
END

pengdali 2003-12-02
  • 打赏
  • 举报
回复
select @@trancount

触发器本身就是事务内的。而不是全局的。
realgz 2003-12-02
  • 打赏
  • 举报
回复
应该不行的吧,这要求和要确切知道宇宙之外的世界一样。
realgz 2003-12-02
  • 打赏
  • 举报
回复
关注。

22,295

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧