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操作記憶體 在指標宣告時,號表示所宣告的變數為指...