ทุกอย่างในเซิร์ฟเวอร์ sql มีอยู่ในการทำธุรกรรม
เมื่อคุณระบุอย่างชัดเจนbegin transaction
และend transaction
จากนั้นก็จะเรียกว่าการทำธุรกรรมที่ชัดเจน เมื่อคุณไม่ได้แล้วมันจะทำธุรกรรมโดยปริยาย
หากต้องการสลับโหมดที่คุณอยู่คุณจะต้องใช้
set implicit_transactions on
หรือ
set implicit_transactions off
select @@OPTIONS & 2
ถ้าข้างต้นกลับ 2 คุณอยู่ในโหมดการทำธุรกรรมโดยปริยาย ถ้ามันคืนค่า 0 แสดงว่าคุณกำลังอยู่ในระบบบันทึกอัตโนมัติ
การทำธุรกรรมคือทั้งหมดหรือไม่มีอะไรที่จะเก็บฐานข้อมูลในสถานะที่สอดคล้อง .. จำคุณสมบัติของกรด
CREATE TABLE [dbo].[Products](
[ProductID] [int] NOT NULL,
[ProductName] [varchar](25) NULL,
[DatabaseName] [sysname] NOT NULL,
CONSTRAINT [pk_Product_ID_ServerName] PRIMARY KEY CLUSTERED
(
[ProductID] ASC,
[DatabaseName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
-- insert some data
INSERT INTO [dbo].[Products]([ProductID], [ProductName], [DatabaseName])
SELECT 1, N'repl1_product1', N'repl1' UNION ALL
SELECT 1, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 1, N'repl3_product1_03', N'repl3' UNION ALL
SELECT 2, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 2, N'repl2_product1', N'repl2' UNION ALL
SELECT 2, N'repl3_product1_03', N'repl3' UNION ALL
SELECT 3, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 3, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 3, N'repl3_product1', N'repl3' UNION ALL
SELECT 4, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 4, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 5, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 5, N'repl2_product1_02', N'repl2'
- สร้าง SP ทันที - โปรดทราบว่า 3 รายการแรกจะประสบความสำเร็จและอันดับที่ 4 จะล้มเหลวเนื่องจากการตัดสตริง ...
IF OBJECT_ID ('usp_UpdateProducts', 'P') IS NOT NULL
DROP PROCEDURE usp_UpdateProducts;
GO
create procedure usp_UpdateProducts
as
begin try
update Products
set ProductName = 'repl1_product1'
where DatabaseName = 'repl1'and ProductID = 1;
update Products
set ProductName = 'repl2_product1'
where DatabaseName = 'repl2' and ProductID = 2;
update Products
set ProductName = 'repl3_product1'
where DatabaseName = 'repl3' and ProductID = 3;
update Products
set ProductName = 'repl3_product1_03&&&&&&&&&&39399338492w9924389234923482' -- this will fail ...
where DatabaseName = 'repl3' and ProductID = 4;
SELECT 1/0;
end try
begin catch
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
end catch
go
อ้างอิงถึง: เป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะสร้างธุรกรรมอยู่เสมอ?