二,EFCore 并发冲突与令牌

二,EFCore 并发冲突与令牌

并发标记
并发分悲观并发和乐观并发。

– 悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档
锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修改。
– 乐观并发:同上面的例子,A,B两个用户同时登录,如果A先进入修改紧跟着B也进入了。A修改文档的
同时B也在修改。如果在A保存之后B再保存他的修改,此时系统检测到数据库中文档记录与B刚进入时
不一致,B保存时会抛出异常,修改失败。

Entity Framework Core 不支持悲观并发,只支持乐观并发。
在这里插入图片描述
约定
按照约定,属性永远不会配置为并发标记。

1.Data Annotations
[ConcurrencyCheck]
public string LastName { get; set; }

2.Fluent API
modelBuilder.Entity().Property(p => p.LastName).IsConcurrencyToken();

3.时间戳和行版本
EF Core 并发冲突与令牌
每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记。

约定
按照约定,属性永远不会配置时间戳。

Data Annotations

[Timestamp]
public byte[] Timestamp { get; set; }

Fluent API
modelBuilder.Entity().Property(p => p.Timestamp).IsRowVersion();

		//代理处理
		static void ConcurrencyCheckTest()
        {
            var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");

            var configuration = configurationBuilder.Build();

            var dbContextOptionsBuilder = new DbContextOptionsBuilder<BloggingContext>();

            dbContextOptionsBuilder.UseSqlServer(configuration.GetConnectionString("test"));

            BloggingContext db1 = new BloggingContext(dbContextOptionsBuilder.Options);
            User user1 = db1.Users.Find(1);

            BloggingContext db2 = new BloggingContext(dbContextOptionsBuilder.Options);
            User user2 = db2.Users.Find(1);

            user1.Memory = user1.Memory - 1;
            db1.SaveChanges();

            try
            {
                user2.Memory = user2.Memory - 1;
                db2.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex) //处理并发字段
            {
                var entityEntry = ex.Entries.Single();

                var original = entityEntry.OriginalValues.ToObject() as User; //数据库原始

                var database = entityEntry.GetDatabaseValues().ToObject() as User; //数据库现在值

                var current = entityEntry.CurrentValues.ToObject() as User; //当前内存值

                entityEntry.Reload();

                current.Memory = current.Memory - 1;

                entityEntry.CurrentValues.SetValues(current);

                db2.SaveChanges();
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值