Пример #1
0
        public void LM_GetReadLockForManyTransactions()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();
            Transaction t2 = new Transaction();

            lm.LockForRead(t1, res1);
            lm.LockForRead(t2, res1);
        }
Пример #2
0
        public void LockForReadTest()
        {
            MyLM target = new MyLM();

            target.setDeadlockTimeout(1000);
            Transaction context  = new Transaction();
            Transaction context2 = new Transaction();
            Lockable    resource = new RID(RID.Type.CAR, "test");

            target.LockForRead(context, resource);
            target.LockForRead(context2, resource);
        }
Пример #3
0
        public void LM_UpgradeReadLockToWriteLock3()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();
            Transaction t2 = new Transaction();

            lm.setDeadlockTimeout(500); // Shorten deadlock timeout to speed up unit test
            lm.LockForRead(t1, res1);
            lm.LockForRead(t2, res1);
            lm.LockForWrite(t1, res1);
        }
Пример #4
0
        public void UnlockAllTest()
        {
            MyLM        target    = new MyLM();
            Transaction context   = new Transaction();
            Transaction context2  = new Transaction();
            Lockable    resource  = new RID(RID.Type.CAR, "test");
            Lockable    resource1 = new RID(RID.Type.FLIGHT, "test");

            target.LockForRead(context, resource);
            target.LockForRead(context, resource1);
            target.UnlockAll(context);
            target.LockForWrite(context2, resource);
            target.LockForWrite(context2, resource1);
        }
Пример #5
0
        public void LockConversionTest3()
        {
            MyLM target = new MyLM();

            target.setDeadlockTimeout(1000);
            Transaction context  = new Transaction();
            Transaction context2 = new Transaction();
            Lockable    resource = new RID(RID.Type.CAR, "test");

            target.LockForUpdate(context, resource);
            target.LockForRead(context2, resource);
            ManualResetEvent e = new ManualResetEvent(false);

            ThreadPool.QueueUserWorkItem((obj) =>
            {
                Thread.Sleep(200);
                target.UnlockRead(context2, resource);
                e.Set();
            });
            target.LockForWrite(context, resource);
            if (!e.WaitOne(2000))
            {
                Assert.Fail("Failed");
            }
        }
Пример #6
0
        public void LM_DowngradeWriteLockToReadLock()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();

            lm.LockForWrite(t1, res1);
            lm.LockForRead(t1, res1);
        }
Пример #7
0
        public void LM_UpgradeReadLockToWriteLock5()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();

            lm.LockForRead(t1, res1);
            lm.LockForWrite(t1, res1);
            lm.LockForWrite(t1, res1); // This should be a noop since the transaction already has a write lock on the resource.
        }
Пример #8
0
        public void LM_GetWritelockOnResLockedWithReadLock()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();
            Transaction t2 = new Transaction();

            lm.setDeadlockTimeout(500); // Shorten deadlock timeout to speed up unit test
            lm.LockForRead(t1, res1);
            lm.LockForWrite(t2, res1);
        }
Пример #9
0
        public void LockConversionTest2()
        {
            MyLM target = new MyLM();

            target.setDeadlockTimeout(1000);
            Transaction context  = new Transaction();
            Transaction context2 = new Transaction();
            Lockable    resource = new RID(RID.Type.CAR, "test");

            target.setDeadlockTimeout(10);
            target.LockForUpdate(context, resource);
            target.LockForRead(context2, resource);
            target.LockForWrite(context, resource);
            Assert.Fail("shall not reach this line");
        }
Пример #10
0
        public void LM_UpgradeReadLockToWriteLock2()
        {
            MyLM lm   = new MyLM();
            RID  res1 = new RID();

            Transaction t1 = new Transaction();

            LM_Rid_Bundle param = new LM_Rid_Bundle(lm, res1);

            Thread thread = new Thread(AttemptWriteLockOnResource);

            lm.setDeadlockTimeout(3000); // Shorten deadlock timeout to 3 seconds speed up unit test
            lm.LockForRead(t1, res1);
            thread.Start(param);
            Thread.Sleep(1000);
            lm.LockForWrite(t1, res1);
            thread.Join();
            // Make sure that the second thread failed with deadlock exception.
            // This should happen because the first thread is still holding either the read lock or write lock
            // when the second thread trys to acquire a write lock. The second thread won't be able to steal the
            // lock from the first thread because two phase locking was used when the LM upgrades the read lock
            // to a write lock.
            Assert.AreEqual(param.status, 1);
        }