来讨论讨论

来讨论讨论

阻碍并发下的产品超卖思路是行使redis串行管理数据,但又有高产出管理数据的手艺

ServiceStack.OrmLite 笔记2

那篇首要介绍 扩展

db.Insert(new Employee { Id = 1, Name = “Employee 1” }); //默许可步

await db.InsertAsync(new Employee { Id = 1, Name = “Employee 1” });
//异步 别的的异步近似这里的那些示例

db.InsertOnly(new Person { FirstName = “Amy” }, q => q.Insert(p =>
new {p.FirstName}))
// 插入部分字段 后边的参数q.Insert表示要插入的字段 生成sql: INSERT INTO
“Person” (“FirstName”) VALUES (‘艾美’)

var rowId = db.Insert(new Poco { Text = “Text” },
selectIdentity:true);// selectIdentity:true重返自拉长的id

这里代码有一点点多 全局的插入时过滤 相仿的有UpdateFilter
,认为便是插入时对数码举办拦阻,能够发挥您的想象,举例可以在这里间加日志,只怕扩大新的字段,交欢做的职业。
public interface IAudit
{
DateTime CreatedDate { get; set; }
DateTime ModifiedDate { get; set; }
string ModifiedBy { get; set; }
}

//表对应的类
public class AuditTableA : IAudit
{
public AuditTableA()
{
this.CreatedDate = this.ModifiedDate = DateTime.UtcNow;
}

    [AutoIncrement]
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
    public string ModifiedBy { get; set; }
}

OrmLiteConfig.InsertFilter = (dbCmd, row) => {
var auditRow = row as IAudit;
if (auditRow != null)
auditRow.CreatedDate = auditRow.ModifiedDate = DateTime.UtcNow;
};
上边是上边方法的新体位,也源于官方网站。对数据开展认证
OrmLiteConfig.InsertFilter = OrmLiteConfig.UpdateFilter = (dbCmd, row)
=> {
var auditRow = row as IAudit;
if (auditRow != null && auditRow.ModifiedBy == null)
throw new ArgumentNullException(“ModifiedBy”);
};

try
{
db.Insert(new AuditTable());
}
catch (ArgumentNullException) {
//throws ArgumentNullException
}

db.Insert(new AuditTable { ModifiedBy = “Me!” }); //succeeds

下边包车型地铁代码因为也可能有insert 就也放上吧
在表被成立恐怕去除的时候施行sql语句
[PostCreateTable(“INSERT INTO TableWithSeedData (Name) VALUES (‘Foo’);”

  • “INSERT INTO TableWithSeedData (Name) VALUES (‘Bar’);”)]
    public class TableWithSeedData
    {
    [AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    }

typeof(TableWithSeedData)
.AddAttributes(new PostCreateTableAttribute(
“INSERT INTO TableWithSeedData (Name) VALUES (‘Foo’);” +
“INSERT INTO TableWithSeedData (Name) VALUES (‘Bar’);”));

前戏和现在,都以能够有和好的耍法
[PreCreateTable(runSqlBeforeTableCreated)][PostCreateTable(runSqlAfterTableCreated)]
[PreDropTable(runSqlBeforeTableDropped)][PostDropTable(runSqlAfterTableDropped)]
public class Table {}

Db.ExecuteSql(“INSERT INTO page_stats (ref_id, fav_count) VALUES
(@refId, @favCount)”, new { refId, favCount }) //直接实行sql语句

Db.ExecuteSqlAsync(“UPDATE page_stats SET view_count = view_count + 1
WHERE id = @id”, new { id })//直接施行sql语句

产品表(product) 

class Product

{

  public int Id{get;set} //自增Id

       public string Name{get;set}//成品名称

       public int Number{get;set}//库存

       public DateTime N提姆e{get;set;}//仓库储存同步时间

       ….

}

仓库储存改换记录表(productNumberRecord卡塔尔国

class productNumberRecord

{

  public int Id{get;set;}

       public int Number{get;set;} //本次消耗库存数据

       public int SurplusNumber{get;set} //此次消耗后的剩下数量

       public DataTime 提姆e{get;set;} //记录时间

       ….

}

1.将产品Id,仓库储存存入redis,每一次操作产物仓库储存,则发出一条仓库储存的改观记录存入sql库中

2.那时sql库产物的其实仓库储存应该是 库存=仓库储存-仓库储存记录(大于NTime时间的笔录)

3.sql库中的余额,能够做准期任务按天或时辰数进行协同,防止过大的记录产生select超时

4.举个例子redis挂掉,那么它将从数据库中 依据步揍2的方式风流罗曼蒂克并仓库储存

 

伪代码完成(不加锁卡塔尔

(最先作业卡塔尔国{

try{

func1(插入更换记录表);
朝气蓬勃经func1 实行倒闭 直接跳出

func3 …

func4 …

等其他作业

funcX(增减redis库存)
假如funcX施行倒闭,直接跳出,不插入日志

借使都成功 则交给业务

catch{
tran.callback()//事务回滚
}

 

admin

网站地图xml地图