tsql - 在 Management Studio 中使用 BEGIN TRANSACTION 有多危险?
问题描述
在 t-sql 中以即时模式修改数据时,为了安全起见,我会将更改包装在 BEGIN TRAN / COMMIT|ROLLBACK 中。但是,我最近开始担心未能发出 COMMIT 或 ROLLBACK 的影响。
我通常在开发代码时每天都打开我的 SSMS 窗口,并且可能希望查看或重用一些 sql。有没有安全的方法来做到这一点?如果我关闭窗口,我知道所有未提交的事务都会得到解决。但是如果我不关闭它呢?例如,如果我被告知要紧急更改生产表怎么办。如果我不这样做,显然会对我们的用户产生影响。
我怎么能确定不是这种情况?当我执行 COMMIT 并看到消息“COMMIT TRANSACTION 请求没有相应的 BEGIN TRANSACTION”时——该消息的范围是什么?这是否意味着该窗格的默认数据库中没有或任何可用数据库中都没有?如果我跑
SELECT * FROM sys.sysprocesses WHERE open_tran = 1
并且没有得到任何结果,如果我然后执行 COMMIT 并看到它运行而没有响应(即,有一个未提交的事务),这意味着什么。
简而言之,COMMIT 的范围是什么,我如何影响它?
解决方案
在已部署的代码中使用事务不再危险。每种方式都有可能你会做或创造一些可以让交易保持开放的东西。因此,在每种情况下都需要采取措施来防范它。
当您发出“commit tran”时,它只会尝试在您的连接中提交 tran。它不会超出您的连接以找到要提交的 trans。范围对您的连接是本地的。
只需在完成之前从您正在工作的任何窗口中运行“select @@trancount”。@@TRANCOUNT 存储当前连接中打开的事务数。
我总是将我的工作与使用一个 SSMS 实例的纯选择/只读/研究类型工作分开,如果我需要修改任何数据,我会打开一个单独的 SSMS。仅在需要时才完成,并在我完成后将其关闭。
您不能影响“提交”命令的范围(据我所知)。
推荐阅读
- java - 在 jar 中加载外部库
- c - C从指向结构数组的指针中获取值
- sql - 在oracle中同时选择和更新表
- javascript - Google表格在合并时将表格分开
- android - 在 Android 中启动 Gmail / Email Intent 显示电子邮件列表
- delphi - 如何在我的项目中创建每个表单的实例?
- python - Python 正则表达式在论文中获得引用
- python - Odoo - 添加与销售订单相关的自定义字段
- origen-sdk - 您如何在 Origen 2 文档中引用 origen 环境?
- regex - 正则表达式查找包含以图像扩展名结尾的“徽标”的所有 URL