天天看點

hibernate mysql autocommit_Hibernate與autoCommit

JDBC 的autoCommit屬性

對于每一個 JDBC connection,都有一個autoCommit屬性,隻有執行commit後,該connection中的操作(statement操作)才會在資料庫中真正執行。是以若是 JDBC connection的autoCommit屬性是false,且sql語句中沒有顯示commit,則sql語句即使被發送到資料庫中,但因為沒有commit,實際上也沒有真正執行。若是connection的autoCommit為true,那麼每一條發送到資料中的sql,會自動commit,即會自動執行。也就是說:commit才會真正的導緻sql語句執行。資料庫預設是自動送出的,即資料庫預設的的autoCommit屬性是true。

Hibernate 的hibernate.connection.autocommit屬性

Hibernate中hibernate.connection.autocommit屬性用來設定擷取到的 JDBC connection的autoCommit屬性。hibernate.cfg.xml中預設是false。session.connection().getAutoCommit()方法可以擷取session對應的connection的autoCommit屬性。

Hibernate 的session.beginTransaction()方法

session.beginTransaction()方法會将session對應的connection的autoCommit屬性設為false,autoCommit=false(相當于connection 的start transaction)就是指開啟jdbc的事務。是以session.beginTransaction()後一定要有:transaction.commit(),不然刷到資料庫中的所有sql執行語句都沒有commit,也就不會執行。

Hibernate 的session.flush()方法

清理session緩存;先由save()等代碼中指定的操作生成對應的sql語句,可能有多條sql語句,再将session中的sql語句發送到資料庫執行。若是在生成sql語句時抛錯,即使生成其它sql語句時正确,也不會生成任何sql語句,也即不會有任何的sql發送到資料庫中去執行。transaction.commit()和session.close()操作都已經有flush()的操作,是以commit或close後就不用flush。

參考文章