python 事務


事務命令

事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。

數據庫開啟事務命令     

-- start transaction 開啟事務 -- Rollback 回滾事務,即撤銷指定的sql語句(只能回退insert delete update語句),回滾到上一次commit的位置 -- Commit 提交事務,提交未存儲的事務 --  -- savepoint 保留點 ,事務處理中設置的臨時占位符 你可以對它發布回退(與整個事務回退不同)     

轉賬實例:

1
2
UPDATE account set balance=balance-5000 WHERE name =”yuan”;
UPDATE account set balance=balance+5000 WHERE name =”xialv”;
復制代碼
create table test2(id int PRIMARY KEY auto_increment,name VARCHAR(20)) engine=innodb; INSERT INTO test2(name) VALUE ("alvin"), ("yuan"), ("xialv"); start transaction; insert into test2 (name)values('silv'); select * from test2; commit; -- 保留點  start transaction; insert into test2 (name)values('wu'); savepoint insert_wu; select * from test2; delete from test2 where id=4; savepoint delete1; select * from test2; delete from test2 where id=1; savepoint delete2; select * from test2; rollback to delete1; select * from test2;
復制代碼

python中調用數據庫啟動事務的方式

復制代碼
import pymysql

#添加數據

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='yyy') cursor = conn.cursor() try: insertSQL0="INSERT INTO ACCOUNT2 (name,balance) VALUES ('oldboy',4000)" insertSQL1="UPDATE account2 set balance=balance-30 WHERE name='yuan'" insertSQL2="UPDATE account2 set balance=balance+30 WHERE name='xialv'" cursor = conn.cursor() cursor.execute(insertSQL0) conn.commit() cursor.execute(insertSQL1) raise Exception cursor.execute(insertSQL2) cursor.close() conn.commit() except Exception as e: conn.rollback() conn.commit() cursor.close() conn.close()
復制代碼

事務特性

<1> 原子性(Atomicity):原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。

<2> 一致性(Consistency):事務前后數據的完整性必須保持一致。在事務執行之前數據庫是符合數據完整性約束的,無論事務是否執行成功,事務結束后的數據庫中的數據也應該是符合完整性約束的。在某一時間點,如果數據庫中的所有記錄都能保證滿足當前數據庫中的所有約束,則可以說當前的數據庫是符合數據完整性約束的。
比如刪部門表前應該刪掉關聯員工(已經建立外鍵),如果數據庫服務器發生錯誤,有一個員工沒刪掉,那么此時員工的部門表已經刪除,那么就不符合完整性約束了,所以這樣的數據庫也就性能太差啦!

<3>隔離性(Isolation):事務的隔離性是指多個用戶並發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所干擾,多個並發事務之間數據要相互隔離。

<4>持久性(Durability):持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

三、隔離性:
將數據庫設計為串行化程的數據庫,讓一張表在同一時間內只能有一個線程來操作。如果將數據庫設計為這樣,那數據庫的效率太低了。所以數據庫的設計這沒有直接將數據庫設計為串行化,而是為數據庫提供多個隔離級別選項,使數據庫的使用者可以根據使用情況自己定義到底需要什么樣的隔離級別。

不考慮隔離性可能出現的問題:

臟讀

復制代碼
--一個事務讀取到了另一個事務未提交的數據,這是特別危險的,要盡力防止。 a 1000 b 1000 a: start transactionupdate set money=money+100 where name=b; b: start transaction; select * from account where name=b;--1100 commit; a: rollback; b: start transaction; select * from account where name=b;--1000
復制代碼

不可重復讀

復制代碼
--在一個事務內讀取表中的某一行數據,多次讀取結果不同。(一個事務讀取到了另一個事務已經提交 -- 的數據--增加記錄、刪除記錄、修改記錄),在某寫情況下並不是問題,在另一些情況下就是問題。  a: start transaction; select 活期賬戶 from account where name=b;--1000 活期賬戶:1000 select 定期賬戶 from account where name=b;--1000 定期賬戶:1000 select 固定資產 from account where name=b;--1000 固定資產:1000 ------------------------------ b: start transaction; update set money=0 where name=b; commit; ------------------------------ select 活期+定期+固定 from account where name=b; --2000 總資產: 2000
復制代碼

虛讀

復制代碼
是指在一個事務內讀取到了別的事務插入的數據,導致前后讀取不一致。(一個事務讀取到了另一個事務已經提交的數據---增加記錄、刪除記錄),在某寫情況下並不是問題,在另一些情況下就是問題。  b 1000 c 2000 d 3000 a: start transaction select sum(money) from account;---3000 3000 ------------------- d:start transaction; insert into account values(d,3000); commit; ------------------- select count(*)from account;---3 3 3000/3 = 1000 1000 
復制代碼

四個隔離級別:
Serializable:可避免臟讀、不可重復讀、虛讀情況的發生。(串行化)
Repeatable read:可避免臟讀、不可重復讀情況的發生。(可重復讀)不可以避免虛讀
Read committed:可避免臟讀情況發生(讀已提交)
Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)

安全性考慮:Serializable>Repeatable read>Read committed>Read uncommitted
數據庫效率:Read uncommitted>Read committed>Repeatable read>Serializable

一般情況下,我們會使用Repeatable read、Read committed mysql數據庫默認的數據庫隔離級別Repeatable read

mysql中設置數據庫的隔離級別語句:

1
set [ global /session] transaction isolation level xxxx;

如果使用global則修改的是數據庫的默認隔離級別,所有新開的窗口的隔離級別繼承自這個默認隔離級別如果使用session修改,則修改的是當前客戶端的隔離級別,和數據庫默認隔離級別無關。當前的客戶端是什么隔離級別,就能防止什么隔離級別問題,和其他客戶端是什么隔離級別無關。
mysql中設置數據庫的隔離級別語句:

1
select @@tx_isolation;

 

 

 

 

cp :https://www.cnblogs.com/yuanchenqi/articles/6437362.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM