Django ORM 事務和鎖

2022-09-07 18:54:09 字數 2665 閱讀 5095

行級鎖

例子:

# 鎖定相關行

obj = book.objects.select_for_update().filter(name='魔道祖師')

# 對滿足條件的資料加上互斥鎖。

# 由於mysql在查詢時自動加的是共享鎖,所以我們可以手動加上互斥鎖。

# create、update、delete操作時,mysql自動加上行級互斥鎖。

共享鎖(s):一般不用加都是自加的。

select * from table_name where ... lock in share mode;
排它鎖(x):我在操作這條資料別人不可以做任何操作 。

select * from table_name where ... for update;
事務的四大特性

原子性(atomicity)

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

一致性(consistency)

一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之後都必須處於一致性狀態。

拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何轉賬,轉幾次帳,事務結束後兩個使用者的錢加起來應該還的是5000,這就是事務的一致性

隔離性(isolation)

隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

即要達到這麼一種效果:對於任意兩個併發的事務t1和t2,在事務t1看來,t2要麼在t1開始之前就結束,要麼在t1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發執行

永續性(durability)

永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即使是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

全域性開啟

工作流程:常用的事務處理方式是將每個請求都包裹在乙個事務中,當請求過來時,django會在呼叫檢視方法前開啟乙個事務。如果請求和處理都正確,就返回結果,django就會提交該事務。否則django會回滾該事務。

例子:對統一個http請求對應的所有sql都放在乙個事務中執行(要麼所有都成功,要麼所有都失敗),是全域性性配置。

databases = ,

'atomic_requests': true, # 全域性開啟事務,繫結的是http請求響應整個過程

'autocommit': false, # 全域性取消自動提交(慎用)

},# 配置其他資料庫

'engine': 'django.db.backends.oracle',

.....

}}

在全域性配置下:如果要針對某乙個檢視函式做不受事務的管控,可以使用non_atomic_requests裝飾器。

from django.shortcuts import render

from books import models

from django.db import transaction # 需要匯入

@transaction.non_atomic_requests

def index(request):

# 此**不在事務內執行

obj = models.books.objects.filter().values()

return render(request, 'index.html', )

atomic區域性使用事務

方法一:給函式做裝飾器來使用

from django.shortcuts import render

from books import models

from django.db import transaction

@transaction.atomic

def index(request):

# 此**在事務內執行

obj = models.books.objects.filter().values()

return render(request, 'index.html', )

方法二:設定事務的儲存點,作為上下文管理器來使用

from django.shortcuts import render

from books import models

from django.db import transaction

def index(request):

# 次**不在事務內執行

obj = models.books.objects.filter().values()

with transaction.atomic(): # 儲存點

# 此**在事務中執行

models.books.objects.filter(id=1)

return render(request, 'index.html', )

事務和鎖 SQLite

2 事務 transaction 2.1 事務的週期 transaction lifecycles 程 序與事務之間有兩件事值得注意 1 哪些物件在事務下執行 這直接與api有關。2 事務的生命週期,即什麼時候開始,什麼時候結束以及它在什麼時候開始影響別的連線 這點對於併發性很重要 這涉及到sqli...

mysql 事務和鎖

事務是dbms得執行單位 開啟事務 set autocommit 0 取消自動提交 或begin 手動開啟乙個事務 提交乙個事務 commit 回滾乙個事務 rollback 在mysql的innodb 引擎中,預設每個操作 insert,update,select for update lock ...

MySQL 事務和鎖

和其他資料庫相比,mysql的鎖機制比較假單,不同的引擎支援不同的鎖機制。myisam和memory使用表級鎖,bdb使用頁面鎖和表級鎖 innodb預設支援行級鎖,也支援表級鎖。myisam表鎖有兩中,乙個是都鎖,乙個是寫鎖,相容性如下 模式讀鎖 寫鎖讀鎖 相容不相容 寫鎖不相容 不相容 可見my...