ACID 是為保證事務(transaction)是正確可靠的,所必須具備的四個特性:
原子性(Atomicity):事務中的操作同時成功或失敗。
一致性(Consistency):資料庫交易不能破壞資料的完整性以及業務邏輯上的一致。
隔離性(Isolation):一個交易不影響其他交易的運作效果。
持久性(Durability):交易完成後,事務所所做的修改應該持久的保存在資料庫中,不會被回滾。
以A 給B 轉帳100元為例:
##原子性:A失去100元與B 收到100 元同時發生。
一致性:A 的帳戶在失去100元後不能為負數。
隔離性:A 帳戶在執行該交易的同時如果執行B 交易失去1元,那麼最終應為失去101元,兩者互不影響。
持久度:A 的帳號失去100元後就不能要回來了。
MySQL交易是由 InnoDB 儲存引擎實現的。
可以用以下的指令明確的開啟交易:
start transaction / (Begin); #一条或多条sql语句 Commit;
MySQL 事務的ACID 特性靠著以下機制實現:
#原子性:undo log,邏輯日誌,記錄SQL 執行相關的資訊。當發生回滾時,InnoDB 會根據undo log 的內容做與之前相反的工作
持久性:redo log,當交易提交時,會調用fsync介面對redo log進行刷盤。
隔離性:鎖定機制與 MVCC。
一致性:資料庫本身的設計。
Go 語言的Gorm 提供了對於事務操作的支援:
db.Transaction(func(tx *gorm.DB) error { // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db') if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { // 返回任何错误都会回滚事务 return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { return err } // 返回 nil 提交事务 return nil })
public class AClass { @Transactional(rollbackFor = Exception.class) public void aFunction() { //todo: 数据库操作A(增,删,该) } }
以上是MySQL關係型資料庫事務的ACID特性與實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!