假设我有一个表,我想使用serial
主键来请求客户端的更改.客户将询问"在密钥X后给我更改".不使用SERIALIZABLE
隔离级别或锁定,这很容易出现竞争条件.
事务A可以先启动,然后执行写操作,然后花费很长时间来提交.同时事务B将在A提交之前启动并提交.来自B的写入将获得比来自A的写入更高的主键.如果客户端现在要求更改,则它将错过来自A的仍然未提交的写入,并记下最新的最高主键.因此,即使在A提交之后,客户端也永远不会看到该更改,因为它的密钥低于客户端已经获得的更改.
是否有可能serial
在提交时以原子方式确定a (或来自计数器的类似值),以便保证在提交时它将高于所有其他值,并且低于在其之后提交的所有值?如果不是解决这个问题的最佳方法是什么?
我有以下函数,旨在"memoize"无参数函数.意思是只调用一次函数,然后在其他时间返回相同的结果.
private static Func<T> Memoize<T>(Func<T> func)
{
var lockObject = new object();
var value = default(T);
var inited = false;
return () => {
if (inited)
return value;
lock (lockObject) {
if (!inited) {
value = func();
inited = true;
}
}
return value;
};
}
Run Code Online (Sandbox Code Playgroud)
我可以确定如果一个线程在锁外读取"inited == true",那么它将读取在"inited"设置为true之前写入的"值"吗?
注意:.NET中的双重检查锁定涵盖了它应该工作的事实,这个问题主要是检查我的实现是否正确并且可能获得更好的替代方案.