<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
SQL Server 中的事務是一組被視為一個單元的 SQL 語句,它們按照“做所有事或不做任何事”的原則執行,成功的事務必須通過 ACID 測試。
首字母縮寫詞 ACID 是指事務的四個關鍵屬性
為了理解這一點,我們將使用以下兩個表測試。
Product (產品表)
ProductID | Name | Price | Quantity |
---|---|---|---|
101 | Laptop | 15000 | 100 |
102 | Desktop | 20000 | 150 |
104 | Mobile | 3000 | 200 |
105 | Tablet | 4000 | 250 |
ProductSales (產品銷售表)
ProductSalesID | ProductID | QuantitySold |
---|---|---|
1 | 101 | 10 |
2 | 102 | 15 |
3 | 104 | 30 |
4 | 105 | 35 |
請使用以下 SQL 指令碼建立並使用範例資料填充 Product 和 ProductSales 表。
IF OBJECT_ID('dbo.Product','U') IS NOT NULL DROP TABLE dbo.Product IF OBJECT_ID('dbo.ProductSales','U') IS NOT NULL DROP TABLE dbo.ProductSales GO CREATE TABLE Product ( ProductID INT PRIMARY KEY, Name VARCHAR(40), Price INT, Quantity INT ) GO INSERT INTO Product VALUES(101, 'Laptop', 15000, 100) INSERT INTO Product VALUES(102, 'Desktop', 20000, 150) INSERT INTO Product VALUES(103, 'Mobile', 3000, 200) INSERT INTO Product VALUES(104, 'Tablet', 4000, 250) GO CREATE TABLE ProductSales ( ProductSalesId INT PRIMARY KEY, ProductId INT, QuantitySold INT ) GO INSERT INTO ProductSales VALUES(1, 101, 10) INSERT INTO ProductSales VALUES(2, 102, 15) INSERT INTO ProductSales VALUES(3, 103, 30) INSERT INTO ProductSales VALUES(4, 104, 35) GO
SQL Server 中事務的原子性確保事務中的所有 DML 語句(即插入、更新、刪除)成功完成或全部回滾。例如,在以下 spSellProduct 儲存過程中,UPDATE 和 INSERT 語句都應該成功。如果 UPDATE 語句成功而 INSERT 語句失敗,資料庫應該通過回滾來撤消 UPDATE 語句所做的更改。
IF OBJECT_ID('spSellProduct','P') IS NOT NULL DROP PROCEDURE spSellProduct GO CREATE PROCEDURE spSellProduct @ProductID INT, @QuantityToSell INT AS BEGIN -- 首先我們需要檢查待銷售產品的可用庫存 DECLARE @StockAvailable INT SELECT @StockAvailable = Quantity FROM Product WHERE ProductId = @ProductId --如果可用庫存小於要銷售的數量,丟擲錯誤 IF(@StockAvailable < @QuantityToSell) BEGIN Raiserror('可用庫存不足',16,1) END -- 如果可用庫存充足 ELSE BEGIN BEGIN TRY -- 我們需要開啟一個事務 BEGIN TRANSACTION -- 首先做減庫存操作 UPDATE Product SET Quantity = (Quantity - @QuantityToSell) WHERE ProductID = @ProductID -- 計算當前最大的產品銷售ID,即 MaxProductSalesId DECLARE @MaxProductSalesId INT SELECT @MaxProductSalesId = CASE WHEN MAX(ProductSalesId) IS NULL THEN 0 ELSE MAX(ProductSalesId) END FROM ProductSales -- 把 @MaxProductSalesId 加一, 所以我們會避免主鍵衝突 --(解釋下,建表的時候,沒有設定主鍵自增,所以需要人工處理自增) Set @MaxProductSalesId = @MaxProductSalesId + 1 -- 把銷售的產品數量記錄到ProductSales表中 INSERT INTO ProductSales VALUES (@MaxProductSalesId, @ProductId, @QuantityToSell) -- 最後,提交事務 COMMIT TRANSACTION END TRY BEGIN CATCH -- 如果發生了異常,回滾事務 ROLLBACK TRANSACTION END CATCH End END
SQL Server 中事務的一致性確保資料庫資料在事務開始之前處於一致狀態,並且在事務完成後也使資料保持一致狀態。如果事務違反規則,則應回滾。例如,如果可用庫存從 Product 表中減少,那麼 ProductSales 表中必須有一個相關條目。
在我們的範例中,假設事務更新了 product 表中的可用數量,突然出現系統故障(就在插入 ProductSales 表之前或中間)。在這種情況下系統會回滾更新,否則我們無法追蹤庫存資訊。
SQL Server 中事務的隔離性確保事務的中間狀態對其他事務不可見。一個事務所做的資料修改必須與所有其他事務所做的資料修改隔離。大多數資料庫使用鎖定來維護事務隔離。
為了理解事務的隔離性,我們將使用兩個獨立的 SQL Server 事務。從第一個事務開始,我們啟動了事務並更新了 Product 表中的記錄,但我們還沒有提交或回滾事務。在第二個事務中,我們使用 select 語句來選擇 Product 表中存在的記錄,如下所示。
在sqlserver management studio 或 Navicat 中新建兩個獨立的查詢視窗
首先在第1個視窗執行以下事務,更新庫存(注意事務沒有提交或回滾,回滾語句被註釋了)
begin tran update dbo.Product set Quantity = 150 where ProductID = 101 --rollback tran
然後在第2個視窗執行以下語句,查詢被更新的產品
select * from dbo.Product where ProductID = 101
你會發現,第2個視窗中的查詢語句被阻塞了(一直處於執行狀態,沒有返回資料)
解決阻塞: 切換到第1個視窗, (按下滑鼠左鍵拖動選擇 rollback tran
,注意不包含註釋 -- ),
然後單獨執行這個語句, 在 sqlserver management studio 直接點選執行就行, 在 Navicat 中,點選執行按鈕右邊的下拉箭頭,點選執行已選擇的,好了,再切換到第2個視窗,你會發現結果出來了
阻塞的原因: SqlServer預設的事務隔離級別是 Read Committed,
在上述的Update語句執行時會在對應的資料行上加一個 排它鎖(X), 直到事務提交或者回滾才會釋放,這保證了在此期間,其他任何事務都不能操作此行資料(查詢也不行),因為排它鎖(也叫獨佔鎖),和其他型別的鎖都是不相容的,這保證了其他事務看不到另一個事務的中間狀態,即避免了髒讀
SQL Server 中事務的永續性確保一旦事務成功完成,它對資料庫所做的更改將是永久性的。即使出現系統故障或電源故障或任何異常變化,它也應該保護已提交的資料。
注意:首字母縮寫詞 ACID 由 Andreas Reuter 和 Theo Härder 在 1983 年建立,然而,Jim Gray 在 1970 年代後期已經定義了這些屬性。大多數流行的資料庫,如 SQL Server、Oracle、MySQL、Postgre SQL 預設都遵循 ACID 屬性。
到此這篇關於SQL Server 中的 ACID 屬性的文章就介紹到這了,更多相關SQL Server ACID內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45