1. 程式人生 > >事務不回滾、Springboot2.0中Hibernate預設建立的mysql表為myisam引擎問題

事務不回滾、Springboot2.0中Hibernate預設建立的mysql表為myisam引擎問題

MyISAM:這個是預設型別,它是基於傳統的ISAM型別,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是儲存記錄和檔案的標準方法。與其他儲存引擎比較,MyISAM具有檢查和修復表格的大多數工具。 MyISAM表格可以被壓縮,而且它們支援全文搜尋。它們不是事務安全的,而且也不支援外來鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量的SELECT,MyISAM是更好的選擇。

InnoDB:這種型別是事務安全的。它與BDB型別具有相同的特性,它們還支援外來鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個事務安全的儲存引擎,建議使用它。如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表,對於支援事物的InnoDB型別的表,影響速度的主要原因是AUTOCOMMIT預設設定是開啟的,而且程式沒有顯式呼叫BEGIN開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行SQL前呼叫BEGIN,多條SQL形成一個事物(即使AUTOCOMMIT開啟也可以),將大大提高效能。

升級到Springboot2.0後,依然是使用jpa、Hibernate來操作mysql,發現Hibernate預設建立的表是myisam引擎,而不是innodb。新增下面的方言即可修改為innodb

spring:
  jpa:
    database: mysql
    show-sql: true
    hibernate:
      ddl-auto: update
      naming:
        # 遇到大寫字母 加”_”的命名
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        # 無修改命名
        # physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  #不加這句則預設為myisam引擎