SQL Server的怪闢:異常與孤立事務

2020-12-11 站長之家

一、首先從SQLServer中Error講起,SQL中錯誤處理有些怪闢 錯誤級別同是16但結果都不同。

以下是引用片段:

以下為引用的內容:

       select * from 一個不在的表
  if @@error<>0
  print '這個沒有輸出'
  go
  raiserror('',16,3)
  if @@error<>0
  print '這個輸出了'
  go
  exec('select * from 一個不在的表')
  if @@error<>0
  print '這個輸出了'
  go
  exec sp_executesql N'select * from 一個不在的表'
  if @@error<>0
  print '這個輸出了'

這樣你可以發現通過exec或sp_executesql執行可疑的sql,這樣就可以在後面捕捉到被異常終止的錯誤。

二、引出孤立事務:

1、孤立事務的產生

以下是引用片段:


  select @@trancount 當前連接的活動事務數 --當前連接的活動事務數為0
  begin tran
  select * from 一個不在的表
  if @@error<>0
  begin
  print '沒有執行到這裡來!'
  if @@trancount<>0 rollback tran
  end
  commit tran

select @@trancount 當前連接的活動事務數 --執行後你看看 當前連接的活動事務數為1,且重複執行會每次累加,這是很耗資源的。

應為rollback根本就沒有被回滾。

2、使用現有手段解決孤立事務

以下是引用片段:

以下為引用的內容:

  print @@trancount print '當前連接的活動事務數' --當前連接的活動事務數為0
  if @@trancount<>0 rollback tran --在這裡寫可以讓孤立事務只保持到下次你的過程被調用
  begin tran
  select * from 一個不在的表
  if @@error<>0
  begin
  print '沒有執行到這裡來!'
  if @@trancount<>0 rollback tran
  end
  commit tran
  ---執行後你看看 當前連接的活動事務數為1,但重複執行不會累加
  print @@trancount print '當前連接的活動事務數'

三、使用setxact_abort 來控制部分違反約束的錯誤的執行過程


  create table Table1 (a int check(a>100))
  go
  set xact_abort on
  begin tran
  insert table1 values(10)
  print '這裡沒有被執行'
  commit tran
  go
  print '' print '==============================================' print ''
  set xact_abort off
  begin tran
  insert table1 values(10)
  print '這裡被執行'
  commit tran
  go
  drop table table1
  但 set xact_abort 對於編譯產生的錯誤確沒有起作用,且同樣會產生孤立事務
  set xact_abort on
  begin tran
  insert 一個不在的表 values(10)
  print '這裡沒有被執行'
  commit tran
  go
  print '' print '==============================================' print ''
  set xact_abort off
  begin tran
  insert 一個不在的表 values(10)
  print '這裡沒有被執行'
  commit tran
  go
  select @@trancount 當前連接的活動事務數 ---有兩個孤立事務
  if @@trancount<>0 rollback tran

對於sql中怪闢的各種錯誤,和孤立事務在t-sql編程中一定要注意,小心孤立事務的陷阱,儘量避免浪費或孤立資源,Microsoft公開宣布過SQLServe下一版本Yukon將有內置異常處理語法。那時可以通過代碼對無法預料的錯誤有更好的控制。

相關焦點

  • SQL Server 2014
    解壓「cn_sql_server_2014_X64.iso」64位系統解壓「cn_sql_server_2014_X64.iso」。右擊「cn_sql_server_2014_X64.iso」點擊「解壓到cn_sql_server_2014_X64.iso」。
  • 如何使用 SQL Server FILESTREAM 存儲非結構化數據?
    SqlConnection sqlConnection = new SqlConnection("Integrated Security=true;server=(local)");SqlCommand sqlCommand = new SqlCommand();sqlCommand.Connection
  • SQL Server 2019安裝教程
    1、選中下載的【sql_server_2019】軟體壓縮包,滑鼠右擊選擇【解壓到sql_server_2019】。2、雙擊打開解壓後的【sql_server_2019】文件夾。3.滑鼠右擊【sql_server_2019.iso】,選擇【打開方式】-【Windows資源管理器】。
  • SQL Server 安裝步驟
    本文通過圖文並茂的形式給大家介紹了SQL server 2016 安裝步驟,非常不錯,具有參考借鑑價值,需要的朋友參考下吧。
  • 不一樣的 SQL Server 日期格式化
    output:DateTime Result Custom Number Result ---- 27/09/2012 123-45-6789 (1 row(s) affected) Referencehttps://docs.microsoft.com/en-us/sql
  • Windows下Laravel 7.0連接sql server - php中文網
    laravel 7.0 默認連接 mysql, 同時項目需要連接 sql servel (另一個系統應用)$users = DB::connection (『php_sqlsrv』)->select (…);
  • 微服務 SpringCloud Alibaba Seata處理分布式事務
    可以理解為seata-server那個服務TM (Transaction Manager) - 事務管理器定義全局事務的範圍:開始全局事務、提交或回滾全局事務。可以理解為事務的發起者帶有@GlobalTransactional的服務。
  • 【參賽作品22】關於遷移SQL server到openGauss的問題和解決
    (之所以列出相同,是為了更放心地使用)openGauss版本:1.0.1SQL server版本:2008對比以下所有內容均基於具體使用,因此將涵蓋使用中較基本方面。存儲過程SQL server和openGauss在存儲過程中的相同點較少,基本上的邏輯基本相同存儲過程均支持輸入(in)、輸出(out)參數存儲過程答題邏輯相似SQL serveropenGauss
  • SQL Server的Descending Indexes降序索引
    OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO 插入測試數據DECLARE @i INT;DECLARE @sql
  • BeetlSQL 3.2.0 發布,多庫和微服務事務支持
    Saga 實現 修復代碼生成因為重構帶來的問題Saga文檔Maven<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version&
  • 5分鐘學會SQL SERVER行轉列、列轉行,PIVOT操作
    本文項目地址:https://github.com/firewang/sql50參考網址:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/from-using-pivot-and-unpivot
  • server sql 作業 使用專題及常見問題 - CSDN
    桌子 (Tables)monitoring.Jobs 監視工作 serverId - serverid ties back to inventory.MasterServerList serverId -serverid 綁定到清單。
  • SQL Server應用程式的高級Sql注入
    [概 要] 這篇文章討論常用的"sql注入"技術的細節,應用於流行的Ms IIS/ASP/SQL-Server平臺。這裡探討有關這種攻擊各種可以注入程序訪問數據和資料庫防範的方法。function Login( cn ) { var username; var password; username = Request.form("username"); password = Request.form("password"); var rso = Server.CreateObject("ADODB.Recordset"); var sql
  • 如何利用Python實現SQL自動化?
    從基礎開始import pyodbcfrom datetime import datetimeclassSql: def__init__(self, database, server# here we are telling python what to connect to (our SQL Server) self.cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server="+server
  • SQL Server 2016新亮點全揭秘
    原文出處:  http://www.informationweek.com/big-data/big-data-analytics/microsoft-sql-server-2016-update-embraces-hybrid-cloud-big-data-/d/d-id/1325548?
  • SQL Server 2017軟體安裝教程
    雙擊打開【cn_sql_server_2017】。
  • MySQL sql_mode 說明(及處理一起 sql_mode 引發的問題)
    因為 insert 失敗在資料庫層面是看不出來的,於是找php的同事看下錯誤信息:1[Err] 1364 - Field `f_company_id` doesn't have a default value很明顯2個 insert 操作,第一條成功,第二條失敗了,但因為沒有控制在一個事務當中,導致app裡面依然提示成功,這是客戶入庫操作
  • SQL Server 2005 全新的數據整合服務
    為了保證數據質量,可使用預測模型來避免數據的不完整和丟失,或者使用關聯和聚集模型來找出異常的和不規則的數據。 可靠性。包可以通過配置來定製其在不同情況下運行的方式,例如針對不同的伺服器環境。使用數字籤名來保證用於部署的包的安全性;運行一個簡單的嚮導就能完成已部署包的安裝;檢查點重啟和對事務的支持;加上WMI偵聽器和靈活的異常處理、事件驅動功能保證無人值守運行的可復原性;與SQL Server Management Studio的集成簡化了在SQL Server環境中對包的管理和監視。 Integration的意義。
  • SQL Server 2017安裝教程
    2.雙擊打開【cn_sql_server_2017.iso】。
  • sql server 帶列名導出至excel
    =@path+@fnameinsert into #tb exec master..xp_fileexist @sql --資料庫創建語句set @sql=@path+@fnameif exists(select 1 from #tb where a=1)set @constr=』DRIVER={Microsoft Excel Driver