深入理解MyBatis MyBatis事務

2021-08-28 11:27:54 字數 4355 閱讀 6037

mybatis可以通過xml配置檔案設定是否進行事務管理, 事務管理主要包括事務的提交,回滾等;

本文主要介紹了事務的入口,mybatis事務操作對資料庫select操作和update操作的影響等;

個人主頁:tuzhenyu』s page

string resource = "mybatis/config.xml";

inputstream is = main.class.getclassloader().getresourceasstream(resource);

sqlsessionfactory sessionfactory = new sqlsessionfactorybuilder().build(is);

sqlsession session = sessionfactory.opensession();

user user = new user();

user.setname("liuliu");

user.setpassword("123123");

user.setscore("88");

session.insert(statement,user);

session.close();

string resource = "mybatis/config.xml";

inputstream is = main.class.getclassloader().getresourceasstream(resource);

sqlsessionfactory sessionfactory = new sqlsessionfactorybuilder().build(is);

sqlsession session = sessionfactory.opensession();

user user = new user();

user.setname("liuliu");

user.setpassword("123123");

user.setscore("88");

session.insert(statement,user);

session.commit();

session.close();

//相當於

public sqlsession opensession()
private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level, boolean autocommit)  catch (exception e)  finally 

}

@override

public void commit()

@override

public void commit(boolean force) catch (exception e) finally

}

public void commit(boolean required) throws sqlexception 

clearlocalcache();

flushstatements();

if (required)

}

public void commit() throws sqlexception 

connection.commit();

}}

@override

public void commit() throws sqlexception

@override

public void rollback() throws sqlexception

sqlsession執行close()關閉操作時,如果close()操作之前進行了update操作未進行commit()事務提交則會進行事務回滾然後再關閉會話;如果update後執行了commit則直接關閉會話;

@override

public int update(string statement, object parameter) catch (exception e) finally

}

@override

public void commit(boolean force) catch (exception e) finally

}

@override

public void close() finally

}

private boolean iscommitorrollbackrequired(boolean force)
@override

public void close(boolean forcerollback) finally

}} catch (sqlexception e) finally

}

事務對select操作的影響主要體現在對快取的影響上,主要包括一級快取和二級快取

errorcontext.instance().resource(ms.getresource()).activity("executing a query").object(ms.getid());

if (closed)

if (querystack == 0 && ms.isflushcacherequired())

listlist;

try else

} finally

if (querystack == 0)

// issue #601

deferredloads.clear();

if (configuration.getlocalcachescope() == localcachescope.statement)

} return list;

}

@override

throws sqlexception

return list;

}} return delegate.query(ms, parameterobject, rowbounds, resulthandler, key, boundsql);

}

查詢二級快取

listlist = (list) tcm.getobject(cache, key);
public object getobject(cache cache, cachekey key)
@override

public object getobject(object key)

// issue #146

if (clearoncommit) else

}

儲存二級快取

如果從二級快取中未命中快取,則需要從資料庫中查取,再將查詢結果放入二級快取中;查詢結果首先放入二級快取臨時快取中,只有執行了commit()事務提交才正式轉移到正式快取中;也就是說只有執行了commit()方法的快取才被下次查詢使用,不然仍會執行資料庫查詢任務並覆蓋上次的臨時快取;

public void putobject(cache cache, cachekey key, object value)
public void putobject(object key, object object)
提交二級快取

public void commit() 

}

public void commit() 

flushpendingentries();

reset();

}

private void flushpendingentries() 

for (object entry : entriesmissedincache)

}}

回滾二級快取

@override

public void close(boolean forcerollback) else

} finally

}

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...