事物就是一組資料庫操作的集合
a:atomic原子性:乙個事務裡面的所有操作要麼全部完成,要麼全部失敗,回滾到事物執行前的狀態
c:consistent一致性:事務前後資料庫的完整性必須保持一致
i:isolation隔離性:乙個事務的執行的不會被其它事務的執行影響,多個併發的事務之間相互隔離,互不影響
d:durability永久性:一旦乙個事務提交後,其對資料庫的改變就是永久的
設定事物的隔離級別
1. read uncommited:不能解決任何隔離性產生的問題
2. read commited:可以避免髒讀
3. repeatable read:可以避免髒讀和不可重複讀,不可避免虛讀
4. serializable :可以避免任何問題(序列化)
show variables like
'%commit%'
+--------------------------------+-------+
| variable_name | value |
+--------------------------------+-------+
| autocommit | on |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
更改mysql資料庫為手動事務
set autocommit = false
讀髒資料(事務a讀取到事務b的未提交的資料)
事物a:
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | aaa | 1010 |
| 2 | bbb | 1000 |
| 3 | ccc | 1000 |
+----+------+-------+
//a視窗的事物:
setsession
transaction
isolation
level
read committed;
start
transaction;
update account set money = money + 10
where id = 1;
//b視窗
setsession
transaction
isolation
level
read committed;
start
transaction;
select * from account;
得到的結果是:
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | aaa | 1000 |
| 2 | bbb | 1000 |
| 3 | ccc | 1000 |
+----+------+-------+
a:執行commit
b:select * from account;//得到的結果為:
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | aaa | 1010 |
| 2 | bbb | 1000 |
| 3 | ccc | 1000 |
+----+------+-------+
證明read committed確實解決了讀髒資料的錯誤,但是又帶來了另乙個問題,即b兩次讀取同乙個資料的時候,出現了不一致的情況。
repetable read
a事務:
setsession
transaction
isolation
level repeatable read;
start
transaction;
update account set money = money + 100
where id = 1;
b事務:
setsession
transaction
isolation
level repeatable read;
start
transaction;
select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | aaa | 1000 |
| 2 | bbb | 1000 |
| 3 | ccc | 1000 |
+----+------+-------+
事物a:commit;
事務b:select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | aaa | 1000 |
| 2 | bbb | 1000 |
| 3 | ccc | 1000 |
+----+------+-------+
證明得到的結果是一樣的,那麼repeatable read這個隔離級別是可以避免髒資料和不可重複讀的
丟失更新的產生的情況
解決方案
悲觀鎖 (假設丟失更新一定會發生 ) —–利用資料庫內部鎖機制,管理事務提供的鎖機制(不需要我們進行任何的操作,資料庫內部會幫我們維護)
1.共享鎖
select * from table lock in share mode(讀鎖、共享鎖)
2.排它鎖
select * from table for update (寫鎖、排它鎖)
update語句預設新增排它鎖
樂觀鎖 (假設丟失更新不會發生)——- 採用程式中新增版本字段解決丟失更新問題
create
table product (
id int,
name varchar(20),
updatetime timestamp
);insert
into product values(1,'冰箱',null);
update product set name='洗衣機'
where id = 1;
解決丟失更新:在資料表新增版本字段,每次修改過記錄後,版本欄位都會更新,如果讀取是版本字段,與修改時版本欄位不一致,說明別人進行修改過資料 (重改) mysql中事務的特性 mysql中事務的四大特性
原子性 atomicity 事務就像 原子 一樣,不可被分割,組成事務的dml操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。一致性 consistency 一旦事務完成,不管是成功的,還是失敗的,整個系統處於資料一致的狀態。隔離性 isolation 乙個事務的執行不會被另乙個事...
mysql中的事務和鎖 MySQL中的事務和鎖
鎖 行級鎖select for update nowaitfalse,skip false 注意必須用在事物裡面 所有匹配的行將被鎖定,知道事務結束。這意味著可以通過鎖防止資料被其他事務修改。一般情況下如果其他事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。事務事務的四大特性 1.原子性 事務包...
MySql中的事務
一.mysql的事務支援不是繫結在mysql伺服器本身,而是與儲存引擎相關 1.myisam 不支援事務,用於唯讀程式提高效能 2.innodb 支援acid事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...