FreeSql實(shí)現(xiàn)了四種數(shù)據(jù)庫(kù)事務(wù)的使用方法,臟讀等事務(wù)相關(guān)方法暫時(shí)未提供。主要原因系這些方法各大數(shù)據(jù)庫(kù)、甚至引擎的事務(wù)級(jí)別五花八門較難統(tǒng)一。
事務(wù)用于處理數(shù)據(jù)的一致性,處于同一個(gè)事務(wù)中的操作是一個(gè)UnitOfWork,要么全部執(zhí)行成功,要么全部執(zhí)行失敗。
指定事務(wù)對(duì)象
FreeSql 提供了指定事務(wù)對(duì)象的方法,將事務(wù)對(duì)象暴露給外部;
orm.Update<xxx>().WithTransaction(指定事務(wù)) .Set(a => a.Clicks +
1).ExecuteAffrows();
ISelect、IInsert、IUpdate、IDelete,都支持 WithTransaction 方法。
同線程事務(wù)
假設(shè)用戶購(gòu)買了價(jià)值100元的商品:
第一步:扣余額;
第二步:扣庫(kù)存;
第一步成功了,到了第二步發(fā)現(xiàn)庫(kù)存不足時(shí),事務(wù)可以回滾,扣余額的數(shù)據(jù)將不生效。
//假設(shè)已經(jīng)有了其他wiki頁(yè)的IFreeSql聲明 fsql.Transaction(() => { var affrows =
fsql.Update<User>().Set(a => a.Wealth - 100) .Where(a => a.Wealth >= 100)
//判斷別讓用戶余額扣成負(fù)數(shù) .ExecuteAffrows(); if (affrows < 1) { throw new
Exception("用戶余額不足"); //拋出異常,事務(wù)退出 } affrows = fsql.Update<Goods>().Set(a =>
a.Stock - 1) .Where(a => a.Stock > 0) //判斷別讓用庫(kù)存扣成負(fù)數(shù) .ExecuteAffrows(); if
(affrows < 1) { throw new Exception("商品庫(kù)存不足"); //拋出異常,回滾事務(wù),事務(wù)退出 //用戶余額的扣除將不生效 }
//程序執(zhí)行在此處,說明都扣成功了,事務(wù)完成并提交 });
注意與說明:
1、數(shù)據(jù)庫(kù)事務(wù)在線程掛載,每個(gè)線程只可開啟一個(gè)事務(wù)連接,重復(fù)開啟會(huì)獲取線程已開啟的事務(wù);
2、在事務(wù)代碼過程中,不可使用異步方法,包括FreeSql提供的數(shù)據(jù)庫(kù)異步方法,否則線程將會(huì)切換事務(wù)不生效;
3、fsql.Transaction
有防止死鎖機(jī)制,60秒事務(wù)未結(jié)束的,將會(huì)被其他線程強(qiáng)行提交(不是回滾),可能造成不完整的事務(wù),但仔細(xì)一想60秒還沒完成的事務(wù)是什么原因呢?如果嫌60秒太少了可以在重載方法的參數(shù)中設(shè)置;
后續(xù)我們將介紹倉(cāng)儲(chǔ)模式下的工作單元,和 DbContext 事務(wù)使用。
系列文章導(dǎo)航
*
(一)入門 <https://www.cnblogs.com/FreeSql/p/11531300.html>
*
(二)自動(dòng)遷移實(shí)體 <https://www.cnblogs.com/FreeSql/p/11531301.html>
*
(三)實(shí)體特性 <https://www.cnblogs.com/FreeSql/p/11531302.html>
*
(四)實(shí)體特性 Fluent Api <https://www.cnblogs.com/FreeSql/p/11531304.html>
*
(五)插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531306.html>
*
(六)批量插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531309.html>
*
(七)插入數(shù)據(jù)時(shí)忽略列 <https://www.cnblogs.com/FreeSql/p/11531316.html>
*
(八)插入數(shù)據(jù)時(shí)指定列 <https://www.cnblogs.com/FreeSql/p/11531318.html>
*
(九)刪除數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531320.html>
*
(十)更新數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531321.html>
*
(十一)更新數(shù)據(jù) Where <https://www.cnblogs.com/FreeSql/p/11531324.html>
*
(十二)更新數(shù)據(jù)時(shí)指定列 <https://www.cnblogs.com/FreeSql/p/11531327.html>
*
(十三)更新數(shù)據(jù)時(shí)忽略列 <https://www.cnblogs.com/FreeSql/p/11531334.html>
*
(十四)批量更新數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531335.html>
*
(十五)查詢數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531339.html>
*
(十六)分頁(yè)查詢 <https://www.cnblogs.com/FreeSql/p/11531341.html>
*
(十七)聯(lián)表查詢 <https://www.cnblogs.com/FreeSql/p/11531346.html>
*
(十八)導(dǎo)航屬性 <https://www.cnblogs.com/FreeSql/p/11531352.html>
*
(十九)多表查詢 <https://www.cnblogs.com/FreeSql/p/11531362.html>
*
(二十)多表查詢 WhereCascade <https://www.cnblogs.com/FreeSql/p/11531372.html>
*
(二十一)查詢返回?cái)?shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531376.html>
*
(二十二)Dto 映射查詢 <https://www.cnblogs.com/FreeSql/p/11531381.html>
*
(二十三)分組、聚合 <https://www.cnblogs.com/FreeSql/p/11531384.html>
*
(二十四)Linq To Sql 語(yǔ)法使用介紹 <https://www.cnblogs.com/FreeSql/p/11531392.html>
*
(二十五)延時(shí)加載 <https://www.cnblogs.com/FreeSql/p/11531395.html>
*
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
<https://www.cnblogs.com/FreeSql/p/11531404.html>
*
(二十七)將已寫好的 SQL 語(yǔ)句,與實(shí)體類映射進(jìn)行二次查詢
<https://www.cnblogs.com/FreeSql/p/11531416.html>
*
(二十八)事務(wù)
*
(二十九)Lambda 表達(dá)式 <https://www.cnblogs.com/FreeSql/p/11531425.html>
*
(三十)讀寫分離 <https://www.cnblogs.com/FreeSql/p/11531430.html>
*
(三十一)分區(qū)分表 <https://www.cnblogs.com/FreeSql/p/11531435.html>
*
(三十二)Aop <https://www.cnblogs.com/FreeSql/p/11531471.html>
*
(三十三)CodeFirst 類型映射 <https://www.cnblogs.com/FreeSql/p/11531543.html>
*
(三十四)CodeFirst 遷移說明 <https://www.cnblogs.com/FreeSql/p/11531550.html>
*
(三十五)CodeFirst 自定義特性 <https://www.cnblogs.com/FreeSql/p/11531576.html>
熱門工具 換一換