// Constructors /// <summary> /// Initializes a new instance of this class. /// </summary> /// <param name="source">The <see cref="UnaryProvider.Source"/> property value.</param> /// <param name="lockMode">The mode of the lock to be acquired.</param> /// <param name="lockBehavior">The behavior of the lock.</param> public LockProvider(CompilableProvider source, LockMode lockMode, LockBehavior lockBehavior) : base(ProviderType.Lock, source) { LockMode = () => lockMode; LockBehavior = () => lockBehavior; Initialize(); }
/// <inheritdoc/> public void Lock(LockMode lockMode, LockBehavior lockBehavior) { using (new ParameterContext().Activate()) { keyParameter.Value = Key.Value; object key = new Triplet <TypeInfo, LockMode, LockBehavior>(TypeInfo, lockMode, lockBehavior); Func <object, object> generator = tripletObj => { var triplet = (Triplet <TypeInfo, LockMode, LockBehavior>)tripletObj; IndexInfo index = triplet.First.Indexes.PrimaryIndex; var query = index.GetQuery() .Seek(() => keyParameter.Value) .Lock(() => triplet.Second, () => triplet.Third) .Select(); return(Session.Compile(query)); }; var source = (ExecutableProvider)Session.StorageNode.InternalQueryCache.GetOrAdd(key, generator); var recordSet = source.GetRecordSet(Session); recordSet.FirstOrDefault(); } }
/// <inheritdoc/> public void Lock(LockMode lockMode, LockBehavior lockBehavior) { var parameterContext = new ParameterContext(); parameterContext.SetValue(keyParameter, Key.Value); object key = new Triplet <TypeInfo, LockMode, LockBehavior>(TypeInfo, lockMode, lockBehavior); Func <object, object> generator = tripletObj => { var triplet = (Triplet <TypeInfo, LockMode, LockBehavior>)tripletObj; var index = triplet.First.Indexes.PrimaryIndex; var query = index.GetQuery() .Seek(context => context.GetValue(keyParameter)) .Lock(() => triplet.Second, () => triplet.Third) .Select(); return(Session.Compile(query)); }; var source = (ExecutableProvider)Session.StorageNode.InternalQueryCache.GetOrAdd(key, generator); using var recordSetReader = source.GetRecordSetReader(Session, parameterContext); recordSetReader.MoveNext(); }
private Exception ExecuteConcurrentQueries(LockMode lockMode0, LockBehavior lockBehavior0, LockMode lockMode1, LockBehavior lockBehavior1) { var key = Session.Query.All <Customer>().First().Key; Exception firstThreadException = null; Exception result = null; var firstEvent = new ManualResetEvent(false); var secondEvent = new ManualResetEvent(false); var firstThread = new Thread(() => { try { using (var session = Domain.OpenSession()) using (session.OpenTransaction()) { _ = session.Query.All <Customer>().Where(c => c.Key == key).Lock(lockMode0, lockBehavior0).ToList(); _ = secondEvent.Set(); _ = firstEvent.WaitOne(); } } catch (Exception e) { firstThreadException = e; _ = secondEvent.Set(); return; } }); firstThread.Start(); _ = secondEvent.WaitOne(); if (firstThreadException != null) { throw firstThreadException; } result = ExecuteQueryAtSeparateThread(s => s.Query.All <Customer>() .Where(c => c.Key == key).Lock(lockMode1, lockBehavior1)); _ = firstEvent.Set(); firstThread.Join(); return(result); }
public static CompilableProvider Lock(this CompilableProvider source, LockMode lockMode, LockBehavior lockBehavior) { return(new LockProvider(source, lockMode, lockBehavior)); }
/// <summary> /// Applies locks to the specified source queryable. /// </summary> /// <typeparam name="TSource">The type of the source element.</typeparam> /// <param name="source">The source sequence.</param> /// <param name="lockMode">The lock mode.</param> /// <param name="lockBehavior">The lock behavior.</param> /// <returns>The same sequence, but with "apply lock" hint.</returns> public static IQueryable <TSource> Lock <TSource>(this IQueryable <TSource> source, LockMode lockMode, LockBehavior lockBehavior) { ArgumentValidator.EnsureArgumentNotNull(source, "source"); ArgumentValidator.EnsureArgumentNotNull(lockMode, "lockMode"); ArgumentValidator.EnsureArgumentNotNull(lockBehavior, "lockBehavior"); var errorMessage = Strings.ExLockDoesNotSupportQueryProviderOfTypeX; var providerType = source.Provider.GetType(); if (providerType != WellKnownOrmTypes.QueryProvider) { throw new NotSupportedException(String.Format(errorMessage, providerType)); } var genericMethod = WellKnownMembers.Queryable.ExtensionLock.MakeGenericMethod(new[] { typeof(TSource) }); var expression = Expression.Call(null, genericMethod, new[] { source.Expression, Expression.Constant(lockMode), Expression.Constant(lockBehavior) }); return(source.Provider.CreateQuery <TSource>(expression)); }