I would like to have a code to be able to lock the row and restart the transaction. I only need this code for a specific call.
class Mapper(db.Model):
__tablename__ = 'dns_mappers'
id = db.Column(db.Integer, primary_key=True)
services_id = db.Column(db.Integer, db.ForeignKey('services.id'), nullable=False)
eni = db.Column(db.String(80), unique=False, index=True, nullable=True, default="Primary")
interface_type = db.Column(db.Integer, nullable=True, default=InterfaceType.secondary.value)
name = db.Column(db.String(80), unique=True, nullable=True)
type = db.Column(db.Integer, nullable=True, default=DnsType.route53.value, index=True)
enabled = db.Column(db.Integer, nullable=True, default=0)
instance_id = db.Column(db.String(80), nullable=True, index=True)
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
updated_at = db.Column(db.DateTime(timezone=True), onupdate=func.now())
last_assignment_completed_at = db.Column(db.DateTime(timezone=True), onupdate=func.now())
last_released_at = db.Column(db.DateTime(timezone=True), nullable=True)
subnet_id = db.Column(db.String(80), nullable=True, index=True)
zone = db.Column(db.String(80), nullable=True, index=True)
dns_group_id = db.Column(db.Integer, nullable=True, default=None, index=True)
#---
def available_by_service_id_dnstype_zone_subnet_group_id(user):
return Mapper.query.filter_by(services_id=service_id, enabled=EnableStatus.enabled.value, type=type,
zone=zone,
subnet_id=subnet_id,
interface_type=interface_type,
dns_group_id=dns_group_id) \
.order_by(DnsMapper.created_at.asc(), DnsMapper.updated_at.asc()).limit(1).with_for_update().one()
However, I am getting dead-lock expectations. Not sure how to avoid this lock. I am getting a sql-alchemy deadlock exception.
EDIT-2
Documenting the exception received: (pymysql.err.OperationalError) (1213, 'Deadlock found when trying to get lock; try restarting transaction')