Mysql數據庫事務的四大特性(ACID)
事務:把一組密不可分的操作系列集合在一起,這些操作要么全部執行,要么全部不執行。
1.原子性:事務是內定義的操作是一個整體,是不可分割的。
2.一致性:同一個事務,多次讀取數據庫中的同一個數據,讀取的內容應該是一致的,不變的。
3.隔離性:不同事務之間相互獨立,互不干擾。
4.持久性:事務提交后,事務內的操作對數據庫的修改被永久保存在數據庫文件中。
事務的開啟
Mysql的事務默認為自動提交,每執行一條DML語句,Mysql數據庫會自動提交一次事務。
將Mysql數據庫事務提交方式修改為手動提交有兩種方式:
1)start transaction (手動開啟一個事務,即關閉數據庫事務的自動提交,每次事務提交后,事務自動提交又會自動打開,即每次都需要手動開啟)
2)set autocommit = off;(將當前會話的事務設置為手動提交,每次事務結束都需要commit或者rollback,下個事務不需要再次手動開啟)
事務提交或回滾(TCL語句)事務控制語句
1)commit
2)rollback
事務的隔離性有四個級別
1 讀未提交 read uncommitted 一個事務可以讀到別的事務尚未提交的數據,出現的問題是讀到的數據為臟數據,稱為臟讀。
2 讀已提交 read committed 一個事務讀不到別的事務還沒提交的數據,可以讀到已經提交的事務。出現的問題是不可重復復,即同一個事務每次讀取的數據會不一致。
3 可重復讀 repeatable read 事務開啟后,同一個事務每次讀到的數據是一致的,就算別的事務提交了新的數據也是讀取不到的,這就造成了讀取的數據有可能跟數據庫的數據不相同,這種方式叫做幻讀。
4 串行化 seriaziable 一個事務的執行,需要等待上一個事務執行完成。正在執行的事務會把當前表鎖住(表級別的鎖),別的事務無法訪問當前的表。出現的問題,數據庫的執行效率低。
上面的四種隔離就別都會有一點小缺陷,那么怎么解決這種問題??
采用行級鎖,即事務只對表中的某些行進行上鎖,其他事務不能訪問上鎖的數據,但是可以修改表中的其他行。
start transcation 關閉自動提交
select * from t_user where uid in(1000,1001)for update;當前事務對1000.1001行的記錄上鎖
注意:用主鍵作為查詢條件才會使用行級鎖,否則會采用表級別的鎖。