1、mysql事務
MySQL事務主要用於處理操作量大,複雜度高的數據。比如,你操作一個數據庫,公司的一個員工離職了,你要在數據庫中刪除他的資料,也要刪除該人員相關的,比如郵箱,個人資產等。這些數據庫操作語言就構成了一個事務。
在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務,所以很多情況下我們都使用innodb引擎。
事務處理可以用來維護數據庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行。
一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
1、事務的原子性:一組事務,要麼成功;要麼撤回。
2、穩定性 : 有非法數據(外鍵約束之類),事務撤回。
3、隔離性:事務獨立運行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。
4、可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務保存到日誌裏
而mysql在默認的情況下,他是把每個select,insert,update,delete等做爲一個事務的,登錄mysql服務器,進入mysql,執行以下命令:
mysql> show variables like 'auto%';
有一個參數autocommit就是自動提交的意思,每執行一個msyql的select,insert,update等操作,就會進行自動提交。
如果把改選項關閉,我們就可以每次執行完一次代碼就需要進行手動提交,connect對象給我們提供了兩種辦法來操作提交數據。
a) mysql事務的方法
commit():提交當前事務,如果是支持事務的數據庫執行增刪改後沒有commit則數據庫默認回滾,白操作了
rollback():取消當前事務
下面我們來看個例子:
我們先創建一個員工表:
create table employees (
emp_no int not null auto_increment,
emp_name varchar(16) not null,
gender enum('M', 'F') not null,
hire_date date not null,
primary key (emp_no)
);
其中,emp_no爲員工id,爲主鍵且唯一
emp_name爲:員工的名字
gender爲:性別,只有M和F兩種選擇
hire_date爲:僱傭的時間。
爲了試驗的效果,我們插入幾條數據:
insert into employees(emp_no, emp_name,gender, hire_date) values(1001, 'lingjiang', 'M', '2015-04-01');
insert into employees(emp_no, emp_name,gender, hire_date) values(1002, 'xiang', 'M', '2015-04-01');
insert into employees(emp_no, emp_name,gender, hire_date) values(1003, 'shang', 'M', '2015-04-01');
mysql> select * from employees;
+--------+-----------+--------+------------+
| emp_no | emp_name | gender | hire_date |
+--------+-----------+--------+------------+
| 1001 | lingjiang | M |2015-04-01 |
| 1002 | xiang | M | 2015-04-01 |
| 1003 | shang | M | 2015-04-01 |
+--------+-----------+--------+------------+
a) rows in set (0.00 sec)
2.遊標
遊標(cursor)
遊標是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果用戶可以用SQL語句逐一從遊標中獲取記錄,並賦給主變量,交由python進一步處理,一組主變量一次只能存放一條記錄
在數據庫中,遊標是一個十分重要的概念。遊標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,遊標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。遊標總是與一條SQL 選擇語句相關聯因爲遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標。
常用方法:
cursor():創建遊標對象 close():關閉此遊標對象
1,創建遊標對象
ImportMySQLdb
db_config= {
'host': '192.168.48.128',
'port': 3306,
'user': 'xiang',
'passwd': '123456',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
cus = cnx.cursor()
這樣就是創建一個遊標對象,以後我們對mysql的各種操作都是基於遊標進行操作我們通過python代碼增加一條數據到數據庫中,代碼如下:
import MySQLdb
def connect_mysql():
db_config = {
'host': '192.168.48.128',
'port': 3306,
'user': 'xiang',
'passwd': '123456',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
return cnx
if __name__ == '__main__':
cnx = connect_mysql()
cus = cnx.cursor()
sql = ''' create table test(idint not null);insert into test(id) values (100);'''
try:
cus.execute(sql)
cus.close()
cnx.commit()
except Exception as e:
cnx.rollback()
print('Error')
# raise e
finally:
cnx.close()
查看數據庫中的數據:select * from employees;並沒有發生變化
解釋:
在我們插入數據僱傭時間字段:hire_date的時候,故意把時間寫錯,導致異常發生,捕獲到異常之後,打印Error,最後關閉mysql連接。cus = cnx.cursor()是創建一個遊標對象。