您好!欢迎访问家园网-www.jy.wang!

家园网

当提交完这个事务,也就是执行了commit之后,这个临时的名称还存在吗

网络 作者:本站 点击:

当提交完这个事务,也就是执行了commit之后,这个临时的名称还存在吗

事务提交后,临时名称还存在吗?

答案:不再存在。

事务名称的“生命周期”只在事务从开始到结束这个时间段内有效。


一、生命周期图

text

时间线 ─────────────────────────────────────────────────────────→

┌─────────────────┐
│ BEGIN TRANSACTION│
│   UPDATE_DATA   │
└────────┬────────┘
         │
         ↓  事务名称生效
    ┌────────────┐
    │ 事务进行中  │  ← 名称 UPDATE_DATA 在这里有效
    │ UPDATE ... │
    │ DELETE ... │
    └─────┬──────┘
          ↓
    ┌────────────┐
    │  COMMIT    │  ← 事务结束,名称失效
    │UPDATE_DATA │
    └────────────┘
          ↓
    ┌────────────┐
    │ SELECT查询 │  ← 名称已不存在
    └────────────┘


二、验证方法

SQL Server 中的验证

sql

-- 1. 开始事务并命名BEGIN TRANSACTION UPDATE_DATA    UPDATE goods SET store_count = 900 WHERE goods_id = 106
    DELETE goods WHERE goods_name = '索尼D7200单反相机'-- 2. 查看当前会话的活动事务(事务名称还在)SELECT @@TRANCOUNT AS 事务计数,
       transaction_id,
       nameFROM sys.dm_tran_active_transactionsWHERE name IS NOT NULL-- 3. 提交事务COMMIT TRANSACTION UPDATE_DATA-- 4. 再次查看当前会话的活动事务(名称已消失)SELECT @@TRANCOUNT AS 事务计数 = 0-- 或者查询系统视图,不会再有这个事务的记录


三、为什么不再存在?

原因说明
事务已结束COMMIT 或 ROLLBACK 后,事务在数据库中已不存在
名称只绑定于事务名称是“事务的名称”,不是“数据库对象的名称”
类似编程语言的局部变量函数执行完,局部变量就消失了

类比

javascript

// JavaScript 函数中的局部变量function updateGoods() {
    let transactionName = "UPDATE_DATA";  // 局部变量
    // ... 执行更新操作
    // 函数结束,transactionName 消失}updateGoods();// 此时 transactionName 已经不存在了


四、事务名称 vs 永久名称对比

对比项事务名称 (如 UPDATE_DATA)表名/存储过程名
存储位置不单独存储存储在系统表
生命周期事务开始 → 事务结束直到被显式删除
跨会话不共享所有会话共享
COMMIT 后❌ 消失✅ 仍然存在
可重复使用是(在新事务中可同名)是(但会冲突)

五、名称的实际作用时间窗口

sql

-- ✅ 这里可以引用名称BEGIN TRANSACTION UPDATE_DATA    -- ✅ 这里可以引用名称(如 SAVE TRANSACTION UPDATE_DATA)
    SAVE TRANSACTION SavePoint1    
    UPDATE goods SET store_count = 900 WHERE goods_id = 106
    
    -- ❌ 如果这里尝试 COMMIT TRANSACTION WrongName,会报错-- ✅ 这里可以引用名称COMMIT TRANSACTION UPDATE_DATA-- ❌ 这里再引用名称会报错-- SELECT * FROM UPDATE_DATA  -- 不存在这个对象-- COMMIT TRANSACTION UPDATE_DATA  -- 已经没有活动事务


六、特殊情况:嵌套事务中的名称

sql

BEGIN TRANSACTION OuterTran    BEGIN TRANSACTION InnerTran        UPDATE goods SET store_count = 900 WHERE goods_id = 106
    COMMIT TRANSACTION InnerTran  -- InnerTran 消失COMMIT TRANSACTION OuterTran      -- OuterTran 消失

内层事务提交后,内层名称消失;外层事务提交后,外层名称也消失。


七、总结

状态事务名称是否存在
BEGIN TRANSACTION 之后✅ 存在
事务执行过程中✅ 存在
COMMIT 之后❌ 不存在
ROLLBACK 之后❌ 不存在
事务出错自动回滚后❌ 不存在

一句话总结:事务名称只在事务活动期间有效(从 BEGIN TRANSACTION 到 COMMIT 或 ROLLBACK)。COMMIT 之后,这个临时名称就彻底消失了,它不会被存储在数据库中,也不会被任何其他事务共享。就像给一次性的任务贴了个标签——任务完成后,标签自然也就不存在了



标签: