天天看點

mysql中last_insert_id()

最近項目中遇到這個問題,總結一下,首先,用這個的環境是:

在使用MyBatis做持久層時,insert語句預設是不傳回記錄的主鍵值,而是傳回插入的記錄條數;如果業務層需要得到記錄的主鍵時,可以通過配置的方式來完成這個功能;

在MySQL中,使用auto_increment類型的id字段作為表的主鍵。

通常的做法,是通過“select max(id) from tablename”的做法,但是顯然這種做法需要考慮并發的情況,需要在事務中對主表加以“X鎖“,待獲得max(id)的值以後,再解鎖。

共享鎖【S鎖】

又稱讀鎖,若事務T對資料對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務隻能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。共享鎖是造成上鎖對象必須被大家共享,它排斥 排他鎖,是以别的會話不能獨占資源對其修改(“修改”會先給修改對象加上 排他鎖 的)。但不排斥其他共享鎖,是以一個對象可被多個會話同時加上共享鎖。

排他鎖【X鎖】

又稱寫鎖。若事務T對資料對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。排他鎖很好了解,是自己獨占資源。其它會話想再在同一對象上加共享或排他鎖都是不允許的。不過其它會話可以讀,這也證明普通的讀是不上鎖的。如果查的對象被修改,查詢操作還會會被重定向到對應的撤銷塊(原來的資料),以保證事務事物隔離和讀一緻&#x