Mysql中的事務

2021-08-01 08:52:57 字數 3733 閱讀 2958

事物就是一組資料庫操作的集合

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事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...