spring事務和資料庫事務有什麼區別?
spring提供了乙個類,由這個類以aop的方式管理,只需要@transactional
即可
為什麼要有事務?
事務的基本概念:要不然全成功,要不然全失敗,為了保證一致性。
轉賬的步驟需要3條語句:查詢a賬戶,a賬戶減去,增加b賬戶
跨行轉賬:分布式事務
一些處理機制:2階段提交、3階段提交…
acid
原子性 一致性 隔離性 永續性
每個特點底層實現的原理是什麼?
原子性事務中的所有操作作為乙個整體,像原子一樣不可分割,通過undolog
回滾日誌實現
undolog
存在**?
log有幾種?
binlog, undolog, redolog, relaylog, errorlog, slowlog
mysql可以看做是分為3層
(查詢快取在8.0之後就沒有了)
只有innodb儲存引擎有 redolog,undolog
所有儲存引擎都有binlog,errorlog,relaylog,slowlog
既然有binlog,為什麼還需要redolog,undolog?
因為在mysql剛開始誕生的時候,並沒有innodb引擎,用的是myisam引擎,它不支援事務。
innodb引擎後來被創造之後,一開始是以外掛程式的形式執行的,但是在5.5版本之後,預設使用的是innodb儲存引擎。
如何在運算元據之前,將資料備份到乙個地方?
undolog,使用反邏輯,根據邏輯計算出實際的值,而不需要在每乙個狀態的時候都儲存乙份資料。
相當於:(實際上不是這樣儲存的)
undolog是否需要落盤?隔離
併發操作,兩個人同時操作同乙個資料,加鎖
加什麼鎖?間隙鎖?樂觀鎖?共享鎖?排它鎖?
永續性資料一旦發生了更新,一定要溢寫到磁碟。下次讀資料的時候,一定要和上一次是一樣的。
永續性通過redolog
和binlog共同保證
永續性實現原理:redolog
innodb_flush_log_at_trx_commit
引數:
0:如果在0.9秒,mysql服務崩了,會丟失1秒的資料。伺服器斷電,該丟都丟。如果只是mysql程序掛了,依然會給你寫到磁碟中去。
1:如果在0.9秒,mysql服務崩了,不會丟資料。每次提交都直接寫磁碟,做到資料足夠安全,但是會帶來效能問題。
2:為什麼要有redolog?直接寫資料不行嗎?
wal——write ahead log溢日誌
以下三種方法都不能做到嚴格不丟資料,都有可能丟失1秒鐘資料。
批量操作的時候,不是每一次都提交事務,而是分批提交。
如果插了900條,剩下100條突然斷電了,重啟之後,可以使用redolog繼續寫
redolog相當於乙個增量儲存,redolog滿了之後,會進行持久化的同步歸檔。然後將redolog清空。
undo和redo的執行順序?
讀未提交,讀已提交,可重複度,序列化
不同的隔離級別可能導致不同的併發異常,如下圖:
不可重複讀:同乙個事務可能讀到不同的資料
mvcc:multi version concurrency control 多版本併發控制
髒讀是指乙個事務讀取到其他事務已修改未提交的內容,不可重複讀是值 讀到其他事務已經提交的內容
不可重複讀
幻讀 跟 不可重讀讀,操作一樣,只不過乙個是修改,乙個是插入
read view
用undolog實現mvcc:
所以undolog還是要存磁碟,所以到底要不要存?
mysql有多少種鎖?
Mysql 事務及鎖機制
事務的基本概念 資料庫事務是構成單一邏輯工作單元的操作集合 注意點 1.資料庫事務可以包含乙個或多個資料庫操作,但這些操作構成乙個邏輯上的整體 2.構成邏輯整體的這些資料庫操作,要麼全部執行成功,要麼全部不執行 3.構成事務的所有操作,要麼全部對資料庫產生影響,要麼全部都不產生影響,即資料庫保持一致...
mysql事務與鎖機制 mysql事務與鎖機制
在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...
mysql事務及其鎖機制
1.事務是一條或多條資料庫操作語句的組合。四個特性 acid 原子性 隔離性 一致性 永續性。mysql 本身不提供事務支援,而是開放了儲存引擎介面,由具體的儲存引擎來實現,具體來說支援 mysql 事務的儲存引擎就是 innodb。儲存引擎實現事務的通用方式是基於 redo log 和 undo ...