Details

    Description

      Currently, lock_t is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: {shared,exclusive,gap-read,gap-write}.

      There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by UPDATE, DELETE, or a locking SELECT) prevents any subsequent INSERT to that range.

      INSERT will acquire a gap-write or insert-intention lock (LOCK_INSERT_INTENTION). It conflicts with previously granted gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.

      An INSERT requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

      In lock_rec_has_to_wait(), gap-write locks do not conflict with gap-write locks of other transactions, even though lock_mode_compatible() would not hold.

      A transaction can wait for at most one record. MDEV-24671 already simplified lock waits by introducing the function lock_wait(). If we pack 2 record heap numbers per byte (4 bits per heap number) in the record lock bitmap, there is no space for a further LOCK_WAIT flag. We might want to create a special type of bitmap for a waiting lock request, to avoid allocating a large bitmap (if the record heap number is 3000, the size of a straightforward bitmap would be 1500 bytes). We might store the attributes of the single-record lock request in the trx_t object. Maybe we could just preallocate a record lock bitmap object in trx_t, to be used for all waiting requests?

      Attachments

        Issue Links

          Activity

            marko Marko Mäkelä created issue -
            marko Marko Mäkelä made changes -
            Field Original Value New Value
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 3 bits per record heap number to represent the 6 combinations of lock modes: {not held,shared,exclusive}×{record,gap}.
            (An exclusive gap lock would correspond to {{LOCK_INSERT_INTENTION}}.)

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 3 bits per record heap number to represent the 6 combinations of lock modes: \{not held,shared,exclusive\}×\{record,gap\}.
            (An exclusive gap lock would correspond to {{LOCK_INSERT_INTENTION}}.)

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            NRE Projects RM_105_CANDIDATE
            kevg Eugene Kosov (Inactive) made changes -
            Assignee Marko Mäkelä [ marko ] Eugene Kosov [ kevg ]
            midenok Aleksey Midenkov made changes -
            serg Sergei Golubchik made changes -
            Fix Version/s 10.5 [ 23123 ]
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 3 bits per record heap number to represent the 6 combinations of lock modes: \{not held,shared,exclusive\}×\{record,gap\}.
            (An exclusive gap lock would correspond to {{LOCK_INSERT_INTENTION}}.)

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all 9 combinations of record and gap lock modes: {unlocked,shared,exclusive}×{none,gap-read,gap-write}

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all 9 combinations of record and gap lock modes: {unlocked,shared,exclusive}×{none,gap-read,gap-write}

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all 9 combinations of record and gap lock modes: \{unlocked,shared,exclusive\}×\{none,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all 9 combinations of record and gap lock modes: \{unlocked,shared,exclusive\}×\{none,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (taken by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any {{INSERT}} to that range. A gap-write lock ({{LOCK_INSERT_INTENTION}}) is mutually exclusive with gap-read locks. An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read or gap-write locks may be held on the same gap by different transactions, as long as there are not both gap-read and gap-write locks for the same gap.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any subsequent {{INSERT}} to that range.

            {{INSERT}} will acquire a gap-write or insert-intention lock ({{LOCK_INSERT_INTENTION}}). It conflicts with *previously granted* gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.

            An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

            Currently, gap-write locks conflict with gap-write locks of other transactions. This may be unnecessary.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            marko Marko Mäkelä made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any subsequent {{INSERT}} to that range.

            {{INSERT}} will acquire a gap-write or insert-intention lock ({{LOCK_INSERT_INTENTION}}). It conflicts with *previously granted* gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.

            An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

            Currently, gap-write locks conflict with gap-write locks of other transactions. This may be unnecessary.

            A transaction can wait for at most one record. It might be simplest to not create a separate bitmap for that, but instead store the attributes of the lock request in the {{trx_t}} object.
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any subsequent {{INSERT}} to that range.

            {{INSERT}} will acquire a gap-write or insert-intention lock ({{LOCK_INSERT_INTENTION}}). It conflicts with *previously granted* gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.

            An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

            In {{lock_rec_has_to_wait()}}, gap-write locks do not conflict with gap-write locks of other transactions, even though {{lock_mode_compatible()}} would not hold.

            A transaction can wait for at most one record. MDEV-24671 already simplified lock waits by introducing the function {{lock_wait()}}. If we pack 2 record heap numbers per byte (4 bits per heap number) in the record lock bitmap, there is no space for a further {{LOCK_WAIT}} flag. We might want to create a special type of bitmap for a waiting lock request, to avoid allocating a large bitmap (if the record heap number is 3000, the size of a straightforward bitmap would be 1500 bytes). We might store the attributes of the single-record lock request in the {{trx_t}} object. Maybe we could just preallocate a record lock bitmap object in {{trx_t}}, to be used for all waiting requests?
            serg Sergei Golubchik made changes -
            Workflow MariaDB v3 [ 87694 ] MariaDB v4 [ 130846 ]
            marko Marko Mäkelä made changes -
            Assignee Eugene Kosov [ kevg ] Vladislav Lesin [ vlad.lesin ]
            AirFocus AirFocus made changes -
            Description Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any subsequent {{INSERT}} to that range.

            {{INSERT}} will acquire a gap-write or insert-intention lock ({{LOCK_INSERT_INTENTION}}). It conflicts with *previously granted* gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.

            An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

            In {{lock_rec_has_to_wait()}}, gap-write locks do not conflict with gap-write locks of other transactions, even though {{lock_mode_compatible()}} would not hold.

            A transaction can wait for at most one record. MDEV-24671 already simplified lock waits by introducing the function {{lock_wait()}}. If we pack 2 record heap numbers per byte (4 bits per heap number) in the record lock bitmap, there is no space for a further {{LOCK_WAIT}} flag. We might want to create a special type of bitmap for a waiting lock request, to avoid allocating a large bitmap (if the record heap number is 3000, the size of a straightforward bitmap would be 1500 bytes). We might store the attributes of the single-record lock request in the {{trx_t}} object. Maybe we could just preallocate a record lock bitmap object in {{trx_t}}, to be used for all waiting requests?
            Currently, {{lock_t}} is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: \{shared,exclusive,gap-read,gap-write\}.

            There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap\-read lock (acquired by {{UPDATE}}, {{DELETE}}, or a locking {{SELECT}}) prevents any subsequent {{INSERT}} to that range.

            {{INSERT}} will acquire a gap-write or insert-intention lock ({{LOCK_INSERT_INTENTION}}). It conflicts with *previously granted* gap-read locks. Gap-read locks may be granted on the same lock if a gap\-write lock has been granted to an active transaction.

            An {{INSERT}} requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.

            In {{lock_rec_has_to_wait()}}, gap-write locks do not conflict with gap-write locks of other transactions, even though {{lock_mode_compatible()}} would not hold.

            A transaction can wait for at most one record. MDEV-24671 already simplified lock waits by introducing the function {{lock_wait()}}. If we pack 2 record heap numbers per byte (4 bits per heap number) in the record lock bitmap, there is no space for a further {{LOCK_WAIT}} flag. We might want to create a special type of bitmap for a waiting lock request, to avoid allocating a large bitmap (if the record heap number is 3000, the size of a straightforward bitmap would be 1500 bytes). We might store the attributes of the single-record lock request in the {{trx_t}} object. Maybe we could just preallocate a record lock bitmap object in {{trx_t}}, to be used for all waiting requests?
            marko Marko Mäkelä made changes -

            People

              vlad.lesin Vladislav Lesin
              marko Marko Mäkelä
              Votes:
              2 Vote for this issue
              Watchers:
              8 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.