据我所知,Azure Table Storage支持乐观并发模式,因此应用程序必须处理因同时更新同一实体而导致的所有错误.
我想知道当您同时更新和读取实体时表存储的行为是什么.是否有任何锁定机制,所以我的读取必须等到实体更新?从同一分区写入和读取实体时,是否有任何性能下降,有时甚至是相同的实体?争?我问这个是因为这个主题在关系数据库的世界中非常重要,但我不确定这个NoSQL解决方案的行为.
你能提供有关这个问题的任何文件吗?
提前致谢
我看到的文档说一个存储帐户中可以有“许多”表。
有谁真正知道极限吗?
如果ETag尚未更改,如何使用Azure表存储实体的ETag更新实体?
例:
var query = (from ent in cloudservicetable.CreateQuery<CloudServiceTableEntity>()
where ent.PartitionKey == "test"
&& ent.Status == "creating"
&& ent.Counter> 0
select ent).AsTableQuery();
var candidates = query.OrderByDescending(s=>s.Counter).ToList();
bool found = false;
while (!found && candidates.Any())
{
//Find best candidate
var candidate = candidates.First();
//If we can decrement the count with out the entity have been changed
//it is a acceptable candidate.
candidate.Counter--;
var opr = TableOperation.Merge(candidate);
// cloudservicetable.ExecuteAsync(opr)
// How do I only do the merge if the etag have not …Run Code Online (Sandbox Code Playgroud) 我有一个包含大量实体的azure表存储,当我通过使用查询"RowKey le'8888"查询Rowkey(数据类型为"Double")小于8888的实体时.我也得到那些实体Rowkey大于8888也.
我将一些事务数据保存在Azure Table Storage的表中.当我尝试"更新"表中的现有实体并向其添加新列时,看起来它没有添加列.
这是一个例子:我在表格中保存时间表条目.当我第一次创建实体时,有一个StartTime但没有EndTime
PersonId -- TransactionId -- StartTime -- EndTime
Run Code Online (Sandbox Code Playgroud)
所以,当我第一次在表中创建实体时,我最终得到了PersonId, TransactionId and StartTime列.后来,我想添加EndTime但看起来它没有添加它,因为在我的对象EndTime是一个可以为空的属性,当它是时NULL,该列不会被创建.
有没有办法更新现有实体并在流程中添加列?如果没有,我将不得不EndTime在初始创建实体期间放入一些虚拟日期并存储它,以便列存在,我可以稍后更新.
我宁愿不存储任何虚拟数据.
我有tableEntity包含byte[]属性
[StorageTableName("TestTable")]
public class TestTableEntity : TableEntity
{
public byte[] Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在这个属性中我想把一些文件转换成字节(如果它不正确 - 请建议另一个解决方案).
var table = tableStorage.Table<TestTableEntity>();
await table.CreateIfNotExistsAsync();
var entity = new TestTableEntity
{
Data = data, //byte[]
PartitionKey = partitionKey, //date
RowKey = schemaName// string
};
await table.InsertOrUpdateAsync(entity);
Run Code Online (Sandbox Code Playgroud)
插入的步骤我得到错误
远程服务器返回错误:(413)请求正文太大并超出了允许的最大限制.
因为数组真的很大.
有什么方法可以解决这个问题吗?
如果你有bool,int,string或Guid种在你的C#TableEntity类成员,这些被转换为Azure的表列相应品种.
这似乎是一个Azure Table中列可以是类型:string,binary,bool,boolean,byte,datetime,decimal,double,guid,int,int16,int32,int64,single,sbyte.
在这些类型中,我应该在我的C#类中使用哪种类型来生成Azure表列作为binary类型?