Vda305 concurrency guerrero

335 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
335
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Vda305 concurrency guerrero

  1. 1. SessionVDA305 Concurrency problems and locking techniques in SQL Server 2000 and VB.NET Fernando G. Guerrero SQL Server MVP .NET Technical Lead QA plc October 2002
  2. 2. Quick info about Fernando (2 milliseconds) • MCSD, MCSE+Internet (W2K), MCDBA, MCT,QA SQL Server MVP • This is where I work: QA, The best learning environment in Europe • Writing for SQL Sever Magazine and SQL Server Professional • This is my main web site: www.callsql.com • This is my book (so far): – Microsoft SQL Server 2000 Programming by Example (ISBN : 0789724499, co-authored with Carlos Eduardo Rojas) • Currently writing on ADO.NET and SQL Server 2000VS .NET Connections
  3. 3. Agenda• Concurrency problems• Isolation levels• Locks• TransactionsVS .NET Connections 3
  4. 4. Concurrency problems• Lost Updates• Uncommitted Dependency• Inconsistent Analysis• Phantom ReadsVS .NET Connections 4
  5. 5. Lost Updates (1) Peter PaulPeter UnitPric UnitPric Paul e e 10.0 10.0 VS .NET Connections Mary 5 (SQL Server)
  6. 6. Lost Updates (2) Peter PaulPeter UnitPric @UP * UnitPric Paul e 1.2 e 10.0 12.0 10.0DECLARE @UP moneySELECT @UP = UnitPriceFROM ProductsWHERE ProductID = 25 VS .NET Connections Mary 6 (SQL Server)
  7. 7. Lost Updates (3) Peter PaulPeter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1 10.0 12.0 10.0 11.0DECLARE @UP money DECLARE @UP moneySELECT @UP = UnitPriceFROM ProductsWHERE ProductID = 25 SELECT @UP = UnitPrice FROM Products WHERE ProductID = 25 VS .NET Connections Mary 7 (SQL Server)
  8. 8. Lost Updates (4) Peter Paul Peter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1DECLARE @UP money 12.0 12.0 12.0 11.0 DECLARE @UP moneySELECT @UP = UnitPrice SELECT @UP = UnitPriceFROM Products FROM ProductsWHERE ProductID = 25 WHERE ProductID = 25UPDATE ProductsSET UnitPrice = @UP * 1.2WHERE ProductID = 25 VS .NET Connections Mary 8 (SQL Server)
  9. 9. Lost Updates (5) Peter Paul Peter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1DECLARE @UP money 11.0 12.0 11.0 11.0 DECLARE @UP moneySELECT @UP = UnitPrice SELECT @UP = UnitPriceFROM Products FROM ProductsWHERE ProductID = 25 WHERE ProductID = 25UPDATE ProductsSET UnitPrice = @UP * 1.2WHERE ProductID = 25 UPDATE Products SET UnitPrice = @UP * 1.1 WHERE ProductID = 25 VS .NET Connections Mary 9 (SQL Server)
  10. 10. Uncommitted Dependency (1) Peter PaulPeter UnitPric UnitPric Paul e e 10.0 10.0 VS .NET Connections Mary 10 (SQL Server)
  11. 11. Uncommitted Dependency (2) Peter PaulPeter UnitPric UnitPric Paul e e 12.0 12.0BEGIN TRANSACTIONUPDATE PRODUCTSSET UnitPrice = UnitPrice * 1.2WHERE ProductID = 25 VS .NET Connections Mary 11 (SQL Server)
  12. 12. Uncommitted Dependency (3) Peter Paul Peter UnitPric UnitPric @UP Paul e e 12.0 12.0 12.0BEGIN TRANSACTION DECLARE @UP moneyUPDATE PRODUCTSSET UnitPrice = UnitPrice * 1.2WHERE ProductID = 25 SELECT @UP = UnitPrice FROM Products (NOLOCK) WHERE ProductID = 25 VS .NET Connections Mary 12 (SQL Server)
  13. 13. Uncommitted Dependency (4) Peter Paul Peter UnitPric UnitPric @UP Paul e eBEGIN TRANSACTION 12.0 10.0 12.0 10.0 12.0 DECLARE @UP moneyUPDATE PRODUCTS SELECT @UP = UnitPriceSET UnitPrice = UnitPrice * 1.2 FROM ProductsWHERE ProductID = 25 WHERE ProductID = 25ROLLBACK TRANSACTION VS .NET Connections Mary 13 (SQL Server)
  14. 14. Uncommitted Dependency (5) Peter Paul Peter UnitPric UnitPric @UP Paul e eBEGIN TRANSACTION 10.0 10.0 12.0 DECLARE @UP moneyUPDATE PRODUCTS SELECT @UP = UnitPriceSET UnitPrice = UnitPrice * 1.2 FROM ProductsWHERE ProductID = 25 WHERE ProductID = 25ROLLBACK TRANSACTION INSERT [Order details] ( OrderID, ProductID, UnitPrice, Quantity, Discount) VALUES (25365, 25, VS .NET Connections Mary @UP, 10, 0.1) 14 (SQL Server)
  15. 15. Inconsistent Analysis (1) PeterPeter Paul VS .NET Connections Mary 15 (SQL Server)
  16. 16. Inconsistent Analysis (2) Peter Peter @Count 830 Paul @Total @Average @Total /DECLARE @Count int, @Count @Total money, @Average moneySELECT @Count = COUNT(DISTINCT OrderID)FROM .NET Connections VS [Order Details] Mary 16 (SQL Server)
  17. 17. Inconsistent Analysis (3) Peter Peter @Count 830 Paul @TotalDECLARE @Count int, @Total money, @Average @Average moneySELECT @Count = @Total / COUNT(DISTINCT OrderID) @CountFROM [Order Details] UPDATE [Order details SET Quantity = 600 WHERE OrderID = 10272 AND ProductID = 20 VS .NET Connections Mary 17 (SQL Server)
  18. 18. Inconsistent Analysis (4) Peter Peter @Count 830 Paul @Total 1304284.2DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average WHERE OrderID = 10272SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43FROM [Order Details] @CountSELECT @Total = SUM(UnitPrice * Quantity * (1 – Discount))FROM [Order Details] VS .NET Connections Mary 18 (SQL Server)
  19. 19. Inconsistent Analysis (5) Peter Peter @Count 830 Paul @Total 1304284.2DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average WHERE OrderID = 10272SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43FROM [Order Details] @CountSELECT @Total = SUM(UnitPrice * Quantity * (1 – Discount))FROM [Order Details] UPDATE [Order details] SET Discount = 0.4 WHERE ProductID = VS .NET Connections Mary20 19 (SQL Server)
  20. 20. Inconsistent Analysis (6) Peter Peter @Count 830 Paul @Total 1304284.2 DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average 1542.78 WHERE OrderID = 10272 SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43 FROM [Order Details] @Count UPDATE [Order details] SET Discount = 0.4 SELECT @Total = WHERE ProductID = 20 SUM(UnitPrice * Quantity * (1 – Discount)) FROM [Order Details]SELECT @Average = AVG(TotalPrice)FROM (…) AS TotOrders VS .NET Connections Mary 20 (SQL Server)
  21. 21. Phantom Reads (1) OrderID ProductI UnitPrice Peter D Paul 10259 37 20.8 10337 37 20.8 10408 37 20.8 10523 37 26.0 10847 37 26.0 10966 37 26.0SELECT OrderID, ProductID, UnitPriceFROM [Order Details]WHERE ProductID = 37 VS .NET Connections Mary 21 (SQL Server)
  22. 22. Phantom Reads (2) OrderID ProductI UnitPricePeter D Paul 10259 37 20.80 10337 37 20.80SELECT OrderID, ProductID, 10408 37 20.80 UnitPriceFROM [Order Details] 10523 37 26.00WHERE ProductID = 37 10847 37 26.00 10966 37 26.00 10615 37 INSERT [Order 31.54 details] (OrderID, ProductID, UnitPrice, MaryQuantity, (SQL Server) Discount) VS .NET Connections 22
  23. 23. Phantom Reads (3) OrderID ProductI UnitPrice Peter D Paul 10259 37 20.80 10337 37 20.80SELECT OrderID, INSERT [Order details] ProductID, 10408 37 20.80 (OrderID, ProductID, UnitPrice UnitPrice, Quantity,FROM [Order Details] 10523 37 26.00 Discount)WHERE ProductID = 37 10847 37 26.00 VALUES (10615, 37, 31.54, 20, 0.1) 10966 37 26.00 10615 37 31.54SELECT OrderID, ProductID, UnitPriceFROM [Order Details]WHERE ProductID = 37 VS .NET Connections Mary 23 (SQL Server)
  24. 24. Isolation levels• Transact-SQL: – READ COMMITTED – READ UNCOMMITTED – REPEATABLE READ – SERIALIZABLE• Extra .NET Isolation Levels: – Chaos (not valid for SQLClient) – Unspecified (not settable for SQLClient)VS .NET Connections 24
  25. 25. Isolation levels vs. Concurrency problems P Problem Isolation S Solution Level X SERIALIZABLE solved by standard UNCOMMITTED REPEATABLE COMMITTED exclusive locks READ READ READ inside transactions Concurrency Problem Lost Update X X X X Dirty Read P S S S InconsisteVS .NET Connections nt P P S S 25 Analysis
  26. 26. READ COMMITTED• Default isolation level• Avoids Dirty Reads – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelReadCom m it . t ed) –S ELECT … FRO M … W I ( TH READCO M M I TTED) –S ELECT … FRO M … W I ( TH READPAS T) – S TRANS ET ACTI N IO LATI N LEVEL READ CO M M I O S O TTED• Requests Shared locks for the duration of the reading operation• Requests Exclusive locks for each modification 26VS .NET Connections
  27. 27. READ UNCOMMITTED• Isolation level only suitable for “sneaking around” – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelReadUnCom m . it ted) –S ELECT … FRO M … W I ( TH READUNCO M M ITTED) –S ELECT … FRO M … W I ( LO CK) TH NO – S TRANS ET ACTI N IO LATI N LEVEL READ UNCO M M I O S O TTED• Doesn’t request Shared locks at all• Requests Exclusive locks for each modificationVS .NET Connections 27
  28. 28. REPEATABLE READ• Quite a restrictive isolation level• Avoids all concurrency problems, except Phantom Reads – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelRepeat eRe . abl ad) –S ELECT … FRO M … W I ( TH REPEATABLEREAD) – S TRANS ET ACTI N IO LATI N LEVEL REPEATABLE READ O S O• Requests Shared locks for the duration of the transaction• Requests Exclusive locks for each modification 28VS .NET Connections
  29. 29. SERIALIZABLE• The most restrictive isolation level• Avoids all concurrency problems – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelS i i e) . eralzabl –S ELECT … FRO M … W I ( ERI ZABLE) TH S ALI –S ELECT … FRO M … W I ( LDLO CK) TH HO – S TRANS ET ACTI N IO LATI N LEVEL S ALI O S O ERI ZABLE• Requests Shared locks for the duration of the transaction• Requests Exclusive locks for each modificationVS .NET Connections 29
  30. 30. Transactions• Transact-SQL transactions• Distributed transactions• .NET Manual transactions• .NET Automatic transactionsVS .NET Connections 30
  31. 31. Transact-SQL transactions• Transaction Statements• Nested transactions• Transactions and Stored Procedures• Transactions and TriggersVS .NET Connections 31
  32. 32. Managing transactions with Transact-SQL Statements• BEGIN TRAN• COMMIT TRAN• ROLLBACK TRANVS .NET Connections 32
  33. 33. Transaction Savepoints• SAVE TRAN TranName• ROLLBACK TRAN TranNameVS .NET Connections 33
  34. 34. Nested transactions• @@TRANCOUNT tells you how many transaction levels you are in• For SQL Server there is only one actual transaction• Commit happens only when all nested transactions are ended• Rollback cancels all nested transactions at onceVS .NET Connections 34
  35. 35. Transactions and Stored Procedures• After Rollback execution continues, but you are outside transaction boundaries• If Rollback happens inside a procedure, the calling process receives error 266, Level 16: – Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.• Good idea to use save points and inform the outer process using output parametersVS .NET Connections 35
  36. 36. Transactions and Triggers• After Rollback execution continues inside the trigger, but you are outside transaction boundaries and the process terminates when the trigger does.• Consider using INSTEAD OF triggers to minimize rollbacks• Consider using cancelling operations instead of rollbacksVS .NET Connections 36
  37. 37. Distributed transactionsVS .NET Connections 37
  38. 38. .NET Manual transactionsVS .NET Connections 38
  39. 39. .NET Automatic transactions• Apply the TransactionAttribute to your class.• Derive your class from the ServicedComponent Class.• Sign the assembly with a strong name. – To sign the assembly using attributes create a key pair using the Sn.exe utility. – sn -k MCTCon.snkVS .NET Connections 39
  40. 40. .NET Automatic transactions (2)<Assembly: ApplicationName("MCTCON")><Assembly: AssemblyKeyFileAttribute("MCTCON.snk")><Transaction(TransactionOption.Required)> Public Class clsProduct Inherits ServicedComponent Dim myConnection As SqlConnection <AutoComplete()> Public Sub RaisePrice(ByVal ProductID As Integer, ByVal amount As Integer) OpenConnection() Updateproduct(ProductID, amount) CloseConnection() End Sub VS .NET Connections 40
  41. 41. .NET Automatic transactions (3)VS .NET Connections 41
  42. 42. Locks• Dynamic locking strategy• Locking SQL Server resources• Types of locks• Hunting for locksVS .NET Connections 42
  43. 43. Dynamic locking strategy• SQL Server tries to minimize locking costs balancing: – Lock granularity – Lock maintenance cost• SQL Server 2000 defaults to row lock when necessary• Uses latches, lightweight synchronization objects, for internal operations, minimizing expensive locksVS .NET Connections 43
  44. 44. Locking SQL Server resources• SQL Server 2000 can lock: – Data Row – Index Key – Any page – Extent – Table – DatabaseVS .NET Connections 44
  45. 45. Types of locks• Shared (S)• Update (U)• Exclusive (X)• Intent: – intent shared (IS) – intent exclusive (IX) – shared with intent exclusive (SIX)• Schema: – schema modification (Sch-M) – schema stability (Sch-S).• Bulk Update (BU)VS .NET Connections 45
  46. 46. A typical case of Deadlockinvolving two connections (demo)VS .NET Connections 46
  47. 47. A Deadlock situation involving more than two connections (demo)VS .NET Connections 47
  48. 48. Binding connections (demo)VS .NET Connections 48
  49. 49. Hunting for locks• Profiler can detect locks• Performance Monitor counts locks• Transaction Log registers transactions. It doesn’t register locks• Convert sp_lock into fn_lock SELECT * FROM ::fn_lock() WHERE Status = WAITVS .NET Connections 49
  50. 50. Using Profiler to detect locks (demo)VS .NET Connections 50
  51. 51. Using Performance Monitor to count locks (demo)VS .NET Connections 51
  52. 52. Detecting transactions in the Transaction Log (demo)VS .NET Connections 52
  53. 53. Locking techniques from ADO.NET• Optimistic concurrency• Pessimistic concurrency• User-defined concurrencyVS .NET Connections 53
  54. 54. Optimistic concurrency• Default behavior from DataAdapter• Based on sp_executesql• SET clause with all new values: – Updated columns – Unchanged columns• WHERE clause with all old values: – Updated columns – Unchanged columnsVS .NET Connections 54
  55. 55. Pessimistic Concurrency• Implemented through SqlCommand objects and stored procedures• Not scaleable: – Requires maintaining connection open – Open transaction – Too much locking for too much time• Necessary in some scenariosVS .NET Connections 55
  56. 56. User-defined concurrency• Trace changes on individual columns• Avoid unnecessary trigger execution• Avoid unnecessary locks• Fewer conflicts• Requires careful designVS .NET Connections 56
  57. 57. User-defined concurrency from ADO.NET (demo)VS .NET Connections 57
  58. 58. Application locks• Give applications access to the SQL Server Lock Manager• sp_getapplock resource_name, lock_mode, lock_owner, lockTimeout‘• sp_releaseapplock resource_name‘, lock_owner ]VS .NET Connections 58
  59. 59. Application locks (demo)VS .NET Connections 59
  60. 60. Do you want to know more?• “Inside SQL Server 2000” (Kalen Delaney, MSPress)• “Advanced Transact-SQL for SQL Server 2000” (Itzik Ben-Gan & Tom Moreau, APress)• “SQL Server 2000 Programming” (Robert Vieira, WROX)• “Microsoft SQL Server 2000 Programming by Example” (Fernando G. Guerrero & Carlos Eduardo Rojas, QUE)• SQL Server 2000 Resource Kit (MSPress & TechNet)• Visit the Microsoft public newsgroups: – msnews.microsoft.com/microsoft.public.sqlserver.*• Download the source code of this session from: – http://www.callsql.com/en/articles VS .NET Connections 60
  61. 61. Do you want to know even more?• Visit the Microsoft public newsgroups: – msnews.microsoft.com/microsoft.public.sql server.* – msnews.microsoft.com/microsoft.public.dot net.*VS .NET Connections 61
  62. 62. Thank you! Questions?• Download the source code of this session from: – http://www.callsql.com/en/articles• You can contact me at: – fernan@guerrerog.orgVS .NET Connections
  63. 63. Thank you! • Please drop off your session evaluations in the basket at the back of the room! • Your comments are greatly appreciated!VS .NET Connections

×