我有以下SQL代码用于向我的数据库插入新记录。
这段代码按照我的期望运行,确保添加的详细信息使用表正确链接,但是看起来过于复杂,我想知道是否采用了正确的方法来解决问题(不确定是否需要任何嵌套事务)。
至少需要一个事务,因为确实需要确保记录不会由于其他用户同时插入而产生不匹配。
我还需要检查事务隔离吗?或者这样就足够了?
DECLARE @CustomerID INT
DECLARE @PropertyID INT
BEGIN TRAN T1
INSERT INTO c_customer (title, f_name, l_name, tel1, tel2, tel3, email, email2,
type, primary_contact, tel1type, tel2type, tel3type)
VALUES(@title, @fname, @lname, @tel1, @tel2, @tel3, @email, @email2,
'Owner', 1, @teltype1, @teltype2, @teltype3)
SET @CustomerID = SCOPE_IDENTITY()
BEGIN TRAN T2
INSERT INTO c_property (address1, address2, address3, post_code, city, county)
VALUES (@address1, @address2, @address3, @postcode, @city, @county)
SET @PropertyID = SCOPE_IDENTITY()
UPDATE c_property
SET invoice_flag = @PropertyID
WHERE c_property = @PropertyID
BEGIN TRAN T3
INSERT INTO c_customer_assignment
VALUES (@PropertyID, @CustomerID)
COMMIT TRAN T1
COMMIT TRAN T2
COMMIT TRAN T3
SELECT @CustomerID, @PropertyID
这段代码按照我的期望运行,确保添加的详细信息使用表正确链接,但是看起来过于复杂,我想知道是否采用了正确的方法来解决问题(不确定是否需要任何嵌套事务)。
至少需要一个事务,因为确实需要确保记录不会由于其他用户同时插入而产生不匹配。
我还需要检查事务隔离吗?或者这样就足够了?
c_customer
和c_property
之间存在M-M关系,则需要这3个表。您不需要3个事务,只需要1个即可,因为任何回滚都将回滚所有3个嵌套事务,因此您不会从嵌套事务中获得任何好处。 - ughai