예제 #1
0
    def test_read_and_write_with_threads(self):
        to_me = queue.Queue()

        def get_read_lock():
            with TableLock(read=[Alphabet]):
                to_me.put("Reading")

        try:
            # Thread can obtain lock alone
            other_thread = Thread(target=get_read_lock)
            other_thread.start()
            assert to_me.get() == "Reading"

            with TableLock(write=[Alphabet]):
                other_thread = Thread(target=get_read_lock)
                other_thread.start()

                # Doesn't lock now
                with pytest.raises(queue.Empty):
                    to_me.get(timeout=0.2)

            # Gets now
            assert to_me.get() == "Reading"
        finally:
            other_thread.join()
예제 #2
0
 def test_read_and_write(self):
     Customer.objects.create(name="Fred")
     with TableLock(read=[Customer], write=[Alphabet]):
         assert self.is_locked("default", Alphabet._meta.db_table)
         assert self.is_locked("default", Customer._meta.db_table)
         ab = Alphabet.objects.create(a=Customer.objects.count())
         assert ab.a == 1
예제 #3
0
    def test_writes_fail_under_read(self):
        with TableLock(read=[Alphabet]):
            with pytest.raises(OperationalError) as excinfo:
                Alphabet.objects.update(a=2)

        assert "was locked with a READ lock and can't be updated" in str(
            excinfo.value)
예제 #4
0
 def test_creates_an_atomic(self):
     assert connection.get_autocommit() == 1
     assert not connection.in_atomic_block
     with TableLock(read=[Alphabet]):
         assert connection.get_autocommit() == 0
         assert connection.in_atomic_block
     assert connection.get_autocommit() == 1
     assert not connection.in_atomic_block
예제 #5
0
    def test_write(self):
        Alphabet.objects.create(a=12345)
        with TableLock(write=[Alphabet]):
            assert Alphabet.objects.count() == 1

            Alphabet.objects.all().delete()
            assert Alphabet.objects.count() == 0

        assert Alphabet.objects.count() == 0
예제 #6
0
    def test_write_with_using(self):
        Alphabet.objects.using('other').create(a=878787)
        with TableLock(write=[Alphabet], using='other'):
            assert Alphabet.objects.using('other').count() == 1

            Alphabet.objects.using('other').all().delete()
            assert Alphabet.objects.using('other').count() == 0

        assert Alphabet.objects.using('other').count() == 0
예제 #7
0
    def test_write_with_table_name(self):
        Alphabet.objects.create(a=71718)
        with TableLock(write=[Alphabet._meta.db_table]):
            assert Alphabet.objects.count() == 1

            Alphabet.objects.all().delete()
            assert Alphabet.objects.count() == 0

        assert Alphabet.objects.count() == 0
예제 #8
0
    def test_write_with_using(self):
        Alphabet.objects.using("other").create(a=878787)
        assert not self.is_locked("other", Alphabet._meta.db_table)

        with TableLock(write=[Alphabet], using="other"):
            assert self.is_locked("other", Alphabet._meta.db_table)
            assert Alphabet.objects.using("other").count() == 1

            Alphabet.objects.using("other").all().delete()
            assert Alphabet.objects.using("other").count() == 0

        assert not self.is_locked("other", Alphabet._meta.db_table)
        assert Alphabet.objects.using("other").count() == 0
예제 #9
0
    def test_write(self):
        Alphabet.objects.create(a=12345)
        assert not self.is_locked("default", Alphabet._meta.db_table)

        with TableLock(write=[Alphabet]):
            assert self.is_locked("default", Alphabet._meta.db_table)
            assert Alphabet.objects.count() == 1

            Alphabet.objects.all().delete()
            assert Alphabet.objects.count() == 0

        assert not self.is_locked("default", Alphabet._meta.db_table)
        assert Alphabet.objects.count() == 0
예제 #10
0
    def test_inherited_model(self):
        TitledAgedCustomer.objects.create(title="Sir", name="Knighty")

        with TableLock(write=[TitledAgedCustomer]):
            assert Customer.objects.count() == 1

            TitledAgedCustomer.objects.create(name="Grandpa Potts", age=99)
            assert Customer.objects.count() == 2
            assert TitledAgedCustomer.objects.count() == 2

            TitledAgedCustomer.objects.all().delete()
            assert Customer.objects.count() == 0
            assert AgedCustomer.objects.count() == 0
            assert TitledAgedCustomer.objects.count() == 0

        assert Customer.objects.count() == 0
        assert AgedCustomer.objects.count() == 0
        assert TitledAgedCustomer.objects.count() == 0
예제 #11
0
 def get_read_lock():
     with TableLock(read=[Alphabet]):
         to_me.put("Reading")
예제 #12
0
    def test_write_fails_touching_other_table(self):
        with pytest.raises(OperationalError) as excinfo:
            with TableLock(write=[Alphabet]):
                Customer.objects.create(name="Lizzy")

        assert excinfo.value.args[0] == 1100  # ER_TABLE_NOT_LOCKED
예제 #13
0
 def test_write_with_table_name(self):
     assert not self.is_locked("default", Alphabet._meta.db_table)
     with TableLock(write=[Alphabet._meta.db_table]):
         assert self.is_locked("default", Alphabet._meta.db_table)
예제 #14
0
 def test_acquire_release(self):
     my_lock = TableLock(read=[Alphabet])
     my_lock.acquire()
     my_lock.release()
예제 #15
0
 def test_read_and_write(self):
     Customer.objects.create(name="Fred")
     with TableLock(read=[Customer], write=[Alphabet]):
         ab = Alphabet.objects.create(a=Customer.objects.count())
         assert ab.a == 1
예제 #16
0
    def test_write_fails_touching_other_table(self):
        with pytest.raises(OperationalError) as excinfo:
            with TableLock(write=[Alphabet]):
                Customer.objects.create(name="Lizzy")

        assert "was not locked with LOCK TABLES" in str(excinfo.value)
예제 #17
0
    def test_write_twice(self):
        with TableLock(write=[Alphabet]):
            Alphabet.objects.create(a=1)

        with TableLock(write=[Alphabet]):
            Alphabet.objects.create(a=2)
예제 #18
0
    def test_fails_in_atomic(self):
        with atomic(), pytest.raises(TransactionManagementError) as excinfo:
            with TableLock(read=[Alphabet]):
                pass

        assert str(excinfo.value).startswith("InnoDB requires that we not be")
예제 #19
0
 def test_acquire_release(self):
     my_lock = TableLock(read=[Alphabet])
     my_lock.acquire()
     my_lock.release()