MySQL累加(Atomicity)是指一個事務(transaction)中的所有操作要么全部完成,要么全部不完成,不會出現部分完成的情況。如果一個事務中的任何操作失敗,整個事務都應該被回滾。
使用MySQL的InnoDB存儲引擎,在進行累加時可以使用原子操作來保證并發訪問的正確性。InnoDB存儲引擎支持的原子操作包括Atomic read-modify-write(MEMORY_AND_XXX)、Atomic compare-and-swap and fetch-and-add等
//以Atomic read-modify-write(MEMORY_AND_XXX)舉例說明 UPDATE table SET field = field & ~0x2 WHERE id = 1; /* 這條sql語句用于將表中id為1的記錄的field字段的第2位設置為0,并返回修改前的值。 這里的&符號是按位與運算,在這里表示將field字段與其按位反轉后的0x2(即0xFFFFFFFD)做按位與運算,可以將field字段的第2位修改為0。 這個操作是原子操作,執行期間所有對該記錄的訪問都被阻塞,直到該操作完成,保證了并發訪問的正確性。 */
除了使用原子操作外,還可以采用類似于樂觀鎖的方式來實現累加操作。先讀取記錄,然后在應用程序中修改值并判斷是否修改成功,如果成功則提交事務,否則回滾事務。這種方式雖然不需要鎖定記錄,但是需要重新嘗試多次,會影響性能。