1、Mysql怎么保證原子性的?
OK,是利用Innodb的undo log。
undo log名為回滾日志,是實現原子性的關鍵,當事務回滾時能夠撤銷所有已經成功執行的sql語句,他需要記錄你要回滾的相應日志信息。
例如:
(1)當你delete一條數據的時候,就需要記錄這條數據的信息,回滾的時候,insert這條舊數據
(2)當你update一條數據的時候,就需要記錄之前的舊值,回滾的時候,根據舊值執行update操作
(3)當年insert一條數據的時候,就需要這條記錄的主鍵,回滾的時候,根據主鍵執行delete操
undo log記錄了這些回滾需要的信息,當事務執行失敗或調用了rollback,導致事務需要回滾,便可以利用undo log中的信息將數據回滾到修改之前的樣子。
2.mysql是如何保證持久性的?
是利用了redo log。Mysql是先把磁盤上的數據加載到內存中,在內存中對數據進行修改,再刷回磁盤上。如果此時突然宕機,內存中的數據就會丟失。redo log包括兩部分:一是內存中的日志緩沖(redo log buffer),該部分日志是易失性的;二是磁盤上的重做日志文件(redo log file),該部分日志是持久的。innodb通過force log at commit機制實現事務的持久性,即在事務提交的時候,必須先將該事務的所有事務日志寫入到磁盤上的redo log file和undo log file中進行持久化。也就是說提交了兩個日志文件。