🍎開啓事務 begin; # 或者下面的語句 start transaction; 🍎事務回滾(回滾到以前的狀態,並關閉事務) rollback; # 回滾 + 關閉 🍎事務提交(將修改提交,並關閉事務) commit; # 提交 + 關閉
由上面關鍵字能夠看出, 一個事務的開始對應一個回滾或者提交, 以後就須要從新開啓事務python
🍎先建立一個用戶餘額表並插入記錄 create table user( id int primary key auto_increment, name varchar(16) not null, balance int not null ); insert user(name,balance) value ("shawn",150000), ("song",20000), ("xing",520022), ("hai",10000); select * from user; # 查看一下全部記錄 🍎開啓事務 begin; # 或者 start transaction; 🍎更新記錄 update user set balance=100 where name="shawn"; update user set balance=100 where name="song"; update user set balance=100 where name="xing"; update user set balance=200 where name="hai"; select * from user; # 查看一下是否修改爲功 🍎事務回滾 rollback; # 回滾以後, 該事務就關閉了 select * from user; # 查看一下是否回滾到原來的數據 🍎再開啓一個事務 begin; 🍎再次對數據進行更新 update user set balance=200 where name="shawn"; update user set balance=200 where name="song"; commit; # 事務提交, 並關閉了該事務 select * from user; # 查看數據的變化 rollback; # 再次使用事務回滾將不在起做用, 由於事務已經關閉了 select * from user;
select * from user where id=1;
import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="123456", database="test02", charset="utf8" ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql1 = "select * from user;" sql2 = "update user set name=%s where id=1;" sql3 = "select * from user;" try: cursor.execute(sql1) # 執行 sql1 print(cursor.fetchall()) rows = cursor.execute(sql2,("song",)) # 執行sql2 print("row : %s"%rows) cursor.execute(sql3) # 執行 sql3 print(cursor.fetchall()) except Exception as E: conn.rollback() # 事務回滾 (在pymysql其實能夠不用回滾,檢測到異常這一段就結束了不會提交) print(f"執行失敗 : {E}") else: conn.commit() # 事務提交 cursor.close() conn.close()
隱式能夠比喻成自動mysql
顯式能夠比喻成手動sql
每條單獨的SQL語句都是一個事務, 語句執行完以後會自動執行 commit 操做, 若是出現錯誤則進行事務回滾至以前的狀態數據庫
set session autocommit=0; # 0 是關閉, 1 是開啓 # [session 是當前會話變量 \ global 是全局變量]
set implicit_transactions ON; # ON 是打開隱式事務模式或關閉自動事務模式 # OFF 是關閉隱式事務模式或打開自動提交事務模式
set autocommit on; # on是開啓自動事務模式 # off是關閉自動提交事務模式
經過指定事務開始語句來顯示的開啓事務, 並由提交或者回滾命令來結束事務session
start transaction
或者 begin
語句開始事務, 以 commit
或者 rollback
語句結束事務在隱式事務中, 不須要使用 begin
或者 start transaction
來開啓事務, 每一個 SQL 語句第一次執行會自動開啓事務, 但須要使用 commit
提交或者 rollback
回滾來結束事務併發
set session autocommit=0; # 0 是關閉, 1 是開啓 # [session 是當前會話變量 \ global 是全局變量]
MySQL 默認爲每條 SQL 語句開啓事務, 而且會在本條 SQL 執行完畢後自動執行 commit 操做進行提交, 設置手動提交的兩種方式:fetch
set session|global autocommit=0 # 禁止自動提交 set session|global autocommit=1 # 開啓自動提交
begin; # 或者 start transaction; [SQL語句] commit; # 或者 rollback;
savepoint [保存點名字]; # 設置保存點 rollback to [某個保存點名字]; # 回滾到某個保存點,該保存點以後的操做都無效包括保存點 rollback; # 回滾開啓事務後的全部操做,並刪除全部保存點,並結束事務
begin; select * from user; update user set name="shawn" where id=1; savepoint one; select * from user; update user set name="xxxx" where id=3; savepoint two; select * from user; delete from user where id>3; savepoint three; select * from user;
rollback to two; select * from user;
rollback to three;
rollback
---end---atom