Cập nhật: Tôi tìm thấy một bài viết giải thích lý do tại sao các giao dịch đang được quảng bá dưới dạng LTM thành MSDTC khi chỉ sử dụng cả GetData và Cập nhật trên cùng một bộ điều hợp dữ liệu trong TransactionScope cùng với giải pháp thay thế.
Các TableAdapters giao dịch + dứt khoát bài đăng blog http://blah.winsmarts.com/2006/06/18/the-definitive-tableadapters--transactions-blog-post.aspx
tôi hiểu được một phần về việc có nhiều kết nối mở cùng một lúc leo thang một giao dịch để được phân phối. Tuy nhiên, tôi đang gặp sự cố khi chỉ có một kết nối và một truy vấn đối với cơ sở dữ liệu đang leo thang nó. Không có bất kỳ giao dịch nào trong quy trình được lưu trữ. Nếu bất cứ ai có một đầu mối, tôi muốn nghe về nó. Từ ví dụ mã của tôi, "adapter.Update (table)" sẽ kích hoạt một giao dịch phân tán.
Tôi đã mang sự can đảm của mã ra khỏi dự án hiện tại của mình và đơn giản hóa hầu hết những gì đang diễn ra và tôi vẫn gặp sự cố tương tự. Điều này về cơ bản là tạo ra một tập dữ liệu với một bộ điều hợp bảng và thiết lập nó với một thủ tục được lưu trữ để chọn, chèn và xóa. Tôi chọn tất cả các bản ghi liên quan với một người dùng cụ thể. Sau đó, tùy thuộc vào nếu một "myPPID" tồn tại cho một trong các bản ghi, tôi thêm nó hoặc xóa nó. Sau đó tôi gọi phương thức cập nhật và xem giao dịch leo thang để được phân phối bằng cách xem Thống kê giao dịch trong các dịch vụ thành phần.
Tôi đang sử dụng Windows XP Pro SP3 và .Net Framework 3.5 cho chương trình khách hàng. Nó kết nối với một cơ sở dữ liệu SQL 2005 qua mạng LAN tới Windows Server 2003 R2 Enterprise Edition SP2.
private void button1_Click(object sender, EventArgs e)
{
int userId = 3;
int myPPId = 881;
using (TransactionScope ts = new TransactionScope())
{
using (DataSet1TableAdapters.AssignedPPTableAdapter adapter
= new MSDTCPromotionTest.DataSet1TableAdapters.AssignedPPTableAdapter())
{
using (DataSet1.AssignedPPDataTable table = adapter.GetData(userId))
{
DataSet1.AssignedPPRow row = table.FindByUserIdmyPPId(
userId, myPPId);
if (row == null)
{
table.AddAssignedPPRow(userId, myPPId, string.Empty,
string.Empty, true);
}
else
{
row.Delete();
}
adapter.Update(table);
}
ts.Complete();
}
}
}
Các chuỗi kết nối là không có gì đặc biệt:
<add name="ConnectionString" connectionString="
Data Source=devdb;
Initial Catalog="TEST MSDTC";
Integrated Security=True"
providerName="System.Data.SqlClient" />
Ngoài ra, các thủ tục lưu trữ những cuộc gọi crud đơn giản.
Tạo:
ALTER procedure [dbo].[p_UserForm_AssignedPP_Insert]
(
@UserId INT,
@myPPId int
)
AS
SET NOCOUNT ON;
INSERT INTO [UsermyPP] ([UserID],[myPPID],[DateCreated])
VALUES (@UserId,@myPPId,GETutcDATE())
đọc:
ALTER procedure [dbo].[p_UserForm_AssignedPP_SelectByUserId]
(
@UserId int
)
AS
SELECT
[UserId],
[myPPId],
'' Title,
'' Abbreviation,
0 IsArchived
from
UsermyPP unpp
where
unpp.[userid] = @UserId
Xóa:
ALTER procedure [dbo].[p_UserForm_AssignedPP_Delete]
(
@Original_UserId INT,
@Original_MyPPId INT
)
AS
SET NOCOUNT ON;
DELETE FROM usermypp WHERE [UserID] = @Original_UserId
AND [MyPPID] = @Original_MyPPId
Cảm ơn thông tin tuyệt vời. Tôi rất thích không sử dụng MSDTC. Tôi đang sử dụng sql2005, 1 db, không chuyển tên miền ứng dụng, nhưng không chắc chắn nếu tôi đang sử dụng 1 kết nối. Có thể đưa ra một ví dụ ngắn về một giao dịch với nhiều câu lệnh sql không được nâng lên dtc không? Có công cụ hay cách nào khác để biết các giao dịch của tôi có được nâng lên msdtc không? – muhan