django mysql行锁定_database – Django:锁定表中的特定行

我有以下

django方法:

def setCurrentSong(request,player):

try:

newCurrentSong = ActivePlaylistEntry.objects.get(

song__player_lib_song_id=request.POST['lib_id'],song__player=player,state=u'QE')

except ObjectDoesNotExist:

toReturn = HttpResponseNotFound()

toReturn[MISSING_RESOURCE_HEADER] = 'song'

return toReturn

try:

currentSong = ActivePlaylistEntry.objects.get(song__player=player,state=u'PL')

currentSong.state=u'FN'

currentSong.save()

except ObjectDoesNotExist:

pass

except MultipleObjectsReturned:

#This is bad. It means that

#this function isn't getting executed atomically like we hoped it would be

#I think we may actually need a mutex to protect this critial section :(

ActivePlaylistEntry.objects.filter(song__player=player,state=u'PL').update(state=u'FN')

newCurrentSong.state = u'PL'

newCurrentSong.save()

PlaylistEntryTimePlayed(playlist_entry=newCurrentSong).save()

return HttpResponse("Song changed")

基本上,我希望它对于给定的玩家来说,只有一个ActivePlaylistEntry在任何给定时间都具有’PL'(播放)状态.但是,我实际上经历过这样的情况:由于连续两次快速调用此方法,我为同一个播放器获得两首歌曲,状态为’PL’.这很糟糕,因为我有其他应用程序逻辑依赖于玩家在任何给定时间只有一首播放歌曲的事实(加上语义上在同一个播放器上同时播放两首不同的歌曲没有意义) .有没有办法让我以原子方式进行更新?只是使用on_commit_success装饰器作为事务运行该方法似乎不起作用.是否有办法锁定属于特定播放器的所有歌曲的表格?我正在考虑向我的模型添加一个锁定列(布尔字段),或者只是在它上面旋转或暂停线程几毫秒并再次检查,但这些感觉超级hackish和脏.我也在考虑创建一个存储过程,但这不是真正的数据库独立性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 架构,一般使用 Django 自带的 ORM(Object-Relational Mapping)来操作数据库。ORM 是一种将关系数据库的数据映射到对象的技术,将程序的对象转换为数据库的记录,从而实现对数据库的操作。 不过,如果你想直接使用 MySQL Connector/Python 驱动来连接 MySQL 数据库,可以在 Django 项目的 `__init__.py` 文件相关配置。具体配置如下: 1. 安装 MySQL Connector/Python 驱动,可以使用 pip 命令进安装: ``` pip install mysql-connector-python ``` 2. 在 Django 项目的 `__init__.py` 文件添加以下代码: ```python import mysql.connector from django.db.backends.mysql.base import DatabaseWrapper # 定义 MySQL Connector/Python 驱动的数据库连接参数 cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database') # 重写 DjangoMySQL 数据库连接方法 class MySQLDatabaseWrapper(DatabaseWrapper): def get_new_connection(self, conn_params): return cnx # 注册 MySQLDatabaseWrapper DatabaseWrapper.register_backend('mysql.connector', 'django.db.backends.mysql.base', 'MySQLDatabaseWrapper') ``` 需要将上述代码的 `your_username`、`your_password`、`your_host` 和 `your_database` 替换为实际的数据库连接参数。 3. 在 Django 项目的 `settings.py` 文件,将 `DATABASES` 配置的 `ENGINE` 改为 `django.db.backends.mysql.connector`,如下所示: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql.connector', 'NAME': 'your_database', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'your_host', 'PORT': 'your_port', } } ``` 需要将上述代码的 `your_username`、`your_password`、`your_host`、`your_database` 和 `your_port` 替换为实际的数据库连接参数。 这样,就可以在 Django 项目使用 MySQL Connector/Python 驱动来连接 MySQL 数据库了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值