該部落格詳解mysql中的事務
關於銀行賬戶轉賬操作,賬戶轉賬是乙個完整的業務,最小的單元,不可再分————————也就是說銀行賬戶轉賬是乙個事務
actno balance
1 500
2 100
轉賬操作update t_act set balance=400 where actno=1;
update t_act set balance=200 where actno=2;
以上兩台dml語句必須同時成功或者同時失敗。最小單元不可再分,當第一條dml語句執行成功後,並不能將底層資料庫中的第乙個賬戶的資料修改,只是將操作記錄了一下;這個記錄是在記憶體中完成的;當第二條dml語句執行成功後,和底層資料庫檔案中的資料完成同步。若第二條dml語句執行失敗,則清空所有的歷史操作記錄,要完成以上的功能必須借助事務
- 任何一條dml語句(insert、update、delete)執行,標誌事務的開啟
- 提交:成功的結束,將所有的dml語句操作歷史記錄和底層硬碟資料來一次同步
- 回滾:失敗的結束,將所有的dml語句操作歷史記錄全部清空
在事物進行過程中,未結束之前,dml語句是不會更改底層資料,只是將歷史操作記錄一下,在記憶體中完成記錄。只有在事物結束的時候,而且是成功的結束的時候,才會修改底層硬碟檔案中的資料
在mysql中,預設情況下,事務是自動提交的,也就是說,只要執行一條dml語句就開啟了事物,並且提交了事務以上的自動提交機制是可以關閉的
對t_user進行提交和回滾操作
提交操作(事務成功)
mysql> start transaction;#手動開啟事務
mysql> insert into t_user(name) values('pp');
mysql> commit;#commit之後即可改變底層資料庫資料
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | jay |
| 2 | man |
| 3 | pp |
+----+------+
3 rows in set (0.00 sec)
回滾操作(事務失敗)mysql> start transaction;
mysql> insert into t_user(name) values('yy');
mysql> rollback;
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | jay |
| 2 | man |
| 3 | pp |
+----+------+
3 rows in set (0.00 sec)
事物a和事物b之間具有一定的隔離性
隔離性有隔離級別(4個)
1、 read uncommitted
- 事物a和事物b,事物a未提交的資料,事物b可以讀取到
- 這裡讀取到的資料叫做「髒資料」
- 這種隔離級別最低,這種級別一般是在理論上存在,資料庫隔離級別一般都高於該級別
2、read committed- 事物a和事物b,事物a提交的資料,事物b才能讀取到
- 這種隔離級別高於讀未提交
- 換句話說,對方事物提交之後的資料,我當前事物才能讀取到
- 這種級別可以避免「髒資料」
- 這種隔離級別會導致「不可重複讀取」
- oracle預設隔離級別
3、repeatable read- 事務a和事務b,事務a提交之後的資料,事務b讀取不到
- 事務b是可重複讀取資料
- 這種隔離級別高於讀已提交
- 換句話說,對方提交之後的資料,我還是讀取不到
- 這種隔離級別可以避免「不可重複讀取」,達到可重複讀取
- 比如1點和2點讀到資料是同乙個
- mysql預設級別
- 雖然可以達到可重複讀取,但是會導致「幻像讀」
4、serializable- 事務a和事務b,事務a在運算元據庫時,事務b只能排隊等待
- 這種隔離級別很少使用,吞吐量太低,使用者體驗差
- 這種級別可以避免「幻像讀」,每一次讀取的都是資料庫中真實存在資料,事務a與事務b序列,而不併發
– read-uncommitted
– read-committed
– repeatable-read
– serializable
• 例如:
[mysqld]
transaction-isolation = read-committed
set [global | session] transaction isolation level 其中的可以是:
– read uncommitted
– read committed
– repeatable read
– serializable
• 例如: set transaction isolation level repeatable read;
• 事務隔離級別的作用範圍分為兩種:
– 全域性級:對所有的會話有效
– 會話級:只對當前的會話有效
• 例如,設定會話級隔離級別為read committed :
mysql> set transaction isolation level read committed;
或:mysql> set session transaction isolation level read committed;
• 設定全域性級隔離級別為read committed :
mysql> set global transaction isolation level read committed;
• 事務隔離級別的作用範圍分為兩種:
– 全域性級:對所有的會話有效
– 會話級:只對當前的會話有效
• 例如,設定會話級隔離級別為read committed :
mysql> set transaction isolation level read committed;
或:mysql> set session transaction isolation level read committed;
• 設定全域性級隔離級別為read committed :
mysql> set global transaction isolation level read committed;
MySQL事務表與非事務表的優缺點
事務表 tst 即儲存引擎型別支援事務處理的表 在mysql中只有innodb和bdb儲存引擎支援事務處理 其他儲存引擎不支援事務處理。而且mysql 5.1以上版本不再支援bdb儲存引擎,所以事務處理我們用得最多的就數innodb儲存引擎了。mysql事務表支援將多條sql語句當作同一任務統一處理...
Spring事務元素屬性表
屬性 是否必須 預設值描述 name 是與事務屬性關聯的方法名,可以使用萬用字元 如get update oropagation 否requried 事務傳播行為,可選值required,supports,mandatory,requries new,not supported,never,nest...
hive外表和事務表
建立外表 beeline u jdbc hive2 n hdfs t location tmp nj12345 case info 建立事務表 clustered by case serial into 250 buckets stored as orc insert insto orc事務表 se...