2011-06-01 159 views
2

我有2個存儲過程A,B,都在一個事務塊中。問題是A調用B,因此,存在遞歸/嵌套事務。我不確定是否有問題?我給A打電話會發生什麼?遞歸/嵌套事務

引自 「MySQL存儲過程編程」:

START TRANSACTION標誌着一個新事務的開始。如果現有交易已在進行中,則START TRANSACTION將發出隱含的COMMIT。當您發出START TRANSACTION時,autocommit屬性(在下一節中介紹)有效且隱式地設置爲0,直到事務結束。我們建議您在任何START TRANSACTION聲明之前明確提交或回滾現有交易,因爲隱含的COMMIT對閱讀或維護您的代碼的人可能並不明顯。

回答

0

只要B還不會調用A,就沒有遞歸情況,只是嵌套事務 - 這應該沒問題。

2

如果這兩個過程在相同的資源上設置/使用鎖定,那麼會導致死鎖。 BA也要求的某些表/行/字段擁有鎖定,這意味着A無法獲得自己的鎖定。因此,A將坐在並等待獲取鎖,直到DBMS超時並回滾。

+0

他們不使用相同的表,在不同的表只是嵌套事務。有問題嗎? – Dagang 2011-06-02 14:49:56

+0

可能的話,如果這些表中的任何一個具有彼此相反的外鍵。但如果他們完全獨立,那麼不,應該沒問題。 – 2011-06-02 16:25:18

0

是的,這是可能的。他們不能重疊。你可以使用SAVEPOINT來完成。

看到這個答案:

Mysql transactions within transactions

+0

我回答說,你可以用保存點來做。我見過很多答案,主要由一個簡短的解釋鏈接組成。 – 2013-11-07 09:16:12

+0

如果我刪除這個答案,我是否可以回覆我的積分? – 2013-11-07 09:18:39

+0

是的,當帖子被刪除時(除非很久以前投票),任何投票的聲望變化都會被顛倒過來。但是downvote已被扭轉。 – Dukeling 2013-11-07 09:25:11