2018年4月16日 星期一

避免長時間的 select lock table 造成 insert or update blocking

啟用資料庫的讀取認可快照選項 (避免select lock)

ALTER DATABASE xxx SET READ_COMMITTED_SNAPSHOT ON

啟用資料庫的快照集隔離選項 (避免insert,update,delete lock)

ALTER DATABASE xxx SET ALLOW_SNAPSHOT_ISOLATION ON

進一步說明

啟用快照集隔離,可讀取交易啟動之前存在的資料,也就是前一個版本的資料,這會讓 insert 跟update 不至於 lock 造成 select blocking 問題,所以開啟此設定可以最大化降低 blocking,同時避免死結發生
使用 nolock 會讀取交易過程中的每次異動,但若交易取消,或最後認可的結果不是當時讀到的資料,則讀取的值就會是從未存在任一版本的 dirty data

2018年4月10日 星期二

利用 directive 動態設定 style

html
====
<div grid="-15"></div> /*設定增量為-15,因為下方要留空間塞其他物件*/

javascript
====
.directive('grid', function ($timeout) {
    return {
        link: function (scope, elem, attrs) {
            var setHeight = function () { /*設定高度填滿剩餘空間*/
                var h = $(window).height() - $(elem).offset().top - 10;
                if (attrs.grid) h += parseFloat(attrs.grid); /*考慮增量*/
                $(elem).height(h);
            }
            $(window).resize(function () { /*當視窗大小改變時再次設定高度*/
                setHeight();
            });
            $timeout(function () { /*使用 timeout 避免初次計算bug*/
                setHeight();
            });
        }
    };
})

2018年4月9日 星期一

server side 刪除 cookie

var c = new HttpCookie("xxx");
c.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(c);

2018年4月6日 星期五

使用 System.Linq.Dynamic 達成動態組合 linq 語法 (以 where 為例)

先使用 nuget 安裝 System.Linq.Dynamic

var name="YYY";

equal
var list=db.XXX.Where($"{name}==@0", 查詢值);

like
var list=db.XXX.Where($"{name}.Contains(@0)", 查詢值);

any
var list=db.XXX.Where($"{nameof(收款用途)}.Any({name}==@0)", 查詢值)

Entity Framework 建立新物件並儲存後馬上取得關聯資料

使用 CreateProxy 建立物件,不要直接 new var newmodel = _contextXXX.CreateProxy<yyy>(); ... _contextXXX.yyy.Add(newmodel); await _contextXXX.SaveC...