mysql 數據庫事務處理_Mysql事務處理問題 - mysql數據庫欄目 - 自學php

今天和同學討論起數據庫事務處理的問題,感覺討論中明白了一些,有些知識看過了,但是沒有實際使用還是不理解。

事務處理就是將一系列操作當做一個原子操作,要么全部執行成功,如果執行失敗則保留執行期的狀態。通過提交和回滾機制來實現操作,如果全部執行成功通過提交執行commit結果就會記錄到數據庫中,如果執行失敗通過回滾操作rollback將發生錯誤之前的所有錯誤消除,回退到原來狀態。

事務都應該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續性)四個詞的首字母所寫,下面以“銀行轉帳”為例來分別說明一下它們的含義:

原子性:組成事務處理的語句形成了一個邏輯單元,不能只執行其中的一部分。換句話說,事務是不可分割的最小單元。比如:銀行轉帳過程中,必須同時從一個帳戶減去轉帳金額,并加到另一個帳戶中,只改變一個帳戶是不合理的。

一致性:在事務處理執行前后,數據庫是一致的。也就是說,事務應該正確的轉換系統狀態。比如:銀行轉帳過程中,要么轉帳金額從一個帳戶轉入另一個帳戶,要么兩個帳戶都不變,沒有其他的情況。

隔離性:一個事務處理對另一個事務處理沒有影響。就是說任何事務都不可能看到一個處在不完整狀態下的事務。比如說,銀行轉帳過程中,在轉帳事務沒有提交之前,另一個轉帳事務只能處于等待狀態。

持續性:事務處理的效果能夠被永久保存下來。反過來說,事務應當能夠承受所有的失敗,包括服務器、進程、通信以及媒體失敗等等。比如:銀行轉帳過程中,轉帳后帳戶的狀態要能被保存下來。

注意Mysql支持的存儲引擎中,默認為MyISAM,是不支持事務處理的,一般都有InnoDB,是支持事務型的。

(1)如果對一個表進行操作的時候需要事務支持,需要配置存儲引擎為InnoDB等支持事務型的。

create table XX() engine=InnoDB;

(2)默認情況下,mysql是自動提交模式(autocommit=1),此時會在每一條語句執行完畢后將所做修改立即提交,此時的commit相當于沒用的,rollback只對前一句語句起作用,其實也沒用,一條mysql語句默認也是原子操作,沒必要。

如果設置默認事務處理,需要將自動提交模式關閉即將autocommit設置為0.

set autocommit=0; 設置模式為關閉

select @@autocommit; 查看值是否已經改變

注意,如果在客戶端設置的話,設置完,之后斷掉連接后再重連又恢復默認設置。每個客戶端只能設置客戶自己的。

(3)如果自動提交模式是打開的,則需使用語句:

start transaction; 開始事務處理

XX1;

XX2;

commit; / rollback;

來開始事務處理;而如果設置為關閉,則無需使用start transaction,連續語句就為事務指導rollback或者commit。

(4)注意創建、改變、刪除數據庫或者其中的數據定義語言以及鎖有關的都不能成為事務的一部分,如下面:

start transaction;

insert into test1 values("8");

create table test2(i int);

insert into test1 values("8");

rollback;

html" name="code">執行一個事務處理,當執行到要創建表時,mysql會自動提交,然后再執行創建語句。如果test1的i為主鍵,則第三條語句出錯,回滾時test1還是插入成功,且創建了表test2.

(5)python中使用數據庫,最好采用這種形式,

import MySQLdb

try:

conn = MySQLdb.connect(host="localhost",user="root",passwd="your passwd",db="dbName")

except MySQLdb.Error,e:

print "Mysql Error %d: %s" % (e.args[0], e.args[1])

else:

pass #conn.close()

try:

cur=conn.cursor()

cur.execute('set autocommit=0') #cur.execute('start transaction')

cur.execute('insert into test1 values("8")')

cur.execute('insert into test1 values("8")')

except MySQLdb.Error,e:

conn.rollback()

print "Mysql Error %d: %s" % (e.args[0], e.args[1])

else:

conn.commit()

cur.close()

conn.close()

(6)并行處理問題

Mysql是一個多用戶的系統,有多用戶在同一時間訪問統一數據表,MySIAM采用的是數據表級的鎖定標記,來保證同一時間只有一個用戶訪問此表;Innodb采用了數據行級的訪問機制,即兩個用戶可以對同一個表中不同行的數據同時進行修改,而如果是同一行,則先來的用戶先鎖住此行,操作結束釋放鎖后,下一個用戶才能操作。

(7)事務處理的隔離性問題

InnoDB默認的隔離級別是repeatable read,如果某個用戶兩次執行同一個select語句,其結果是可重復的,如果在事務期間有用戶對所要讀取的數據進行了操作,那么也不會有顯示,比如一個存儲引擎為innodb的表,如果有一個客戶用事務來select讀取表數據,另一個用戶此時對表做了一個插入之類的操作,第一個用戶再進行同樣的select讀取時,顯示數據是沒有變化的。

(8)多語句操作非原子操作

如上面(6)中會出現一個問題,如果是一個事務操作,讀取數據后,想對數據進行操作,但是可能有另外一個人對此做了操作,那再對此數據進行操作就不對了。

此時需要明確加鎖來鎖住表,防止別人更改數據,執行結束后釋放鎖。

lock tables XX write;

XXXXXX;

unlock tables;

也可以使用相對更新代替絕對更新,相對于當前值進行更新,不根據上次的值算出一個絕對值進行更新。這樣避免了多條語句的非原子操作。

set a = a - 3 XXXXXXXXXXX;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[LeetCode] Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. 一開始想用棧,但是試來試去發現寫不出來遂放棄,后來想想再不濟可以轉換成數組然后分別兩頭掃,但是這樣就用了O(n) 的空間,再進一步,可不可以在鏈表里模…

【原創】Ajax的用法總結

一、什么是AjaxAjax英文全稱為“ Asynchr JavsScript and XML”(異步的JavaScript和XML),是一種創建交互式網頁的開發技術。二、Ajax技術的核心Ajax是一系列相關技術的融合,其核心包括XMLHttpRequest、JavsScript和DOM技術&#x…

gprs java_WISMO模塊GPRS上網設置的過程

WISMO模塊GPRS上網設置的過程一) AT指令設置部分(1) ATCGCLASS“B”置為“網絡WISMO模塊GPRS上網設置的過程一) AT指令設置部分(1) ATCGCLASS“B”置為“B”模式。(2) ATCGDCONT1,“IP”,“CMNET”設置APN。(3) ATCSQ 檢查信號 若返回10—31&#xff0c…

loadrunner性能測試步驟

性能測試過程分為4個階段:設計、構建、執行、分析/診斷/調節具體的工作流程如下圖 設計  >  構建  >  執行   >  分析/診斷/調節 收集要求    設置測試環境 基準測試    診斷瓶頸 設計測試策略  記錄測試腳本 性能測試     調…

Asp.Net生命周期的詳解

一.Asp.Net頁面生命周期的概念當我們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向服務器端IIS)發送一個request請求,服務器就會判斷發送過來的請求頁面,當完全識別 TTP頁面處理程序類后,A…

java chain_java 8中 predicate chain的使用

java 8中 predicate chain的使用簡介Predicate是一個FunctionalInterface,代表的方法需要輸入一個參數,返回boolean類型。通常用在stream的filter中,表示是否滿足過濾條件。boolean test(T t);基本使用我們先看下在stream的filter中怎么使用P…

前段技術學習計劃

資料: 著作權歸作者所有。 商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 作者:陳禹魯 鏈接:http://www.zhihu.com/question/19809484/answer/35544452 來源:知乎 第一本,入門 《Head first HTML&…

指針的概念

在C語言中,內存單元的地址稱為指針,專門用來存放地址的變量,有時對地址,指針和指針變量不區分,統稱指針。(地址指針) 一般情況下,最前面的存儲類型通常會省略 指針在說明的同時&…

整理一些提高C#編程性能的技巧

1、使用StringBuilder代替使用string 連接符 ""說明:String類對象是不可變的(只讀),一旦創建該對象,就不能修改該對象的值。對象String對象的重新賦值,本質上是重新創建了一個String對象并將新的…

python爬知識星球付費數據_用python爬取知識星球

去年我們做過一個叫「學長問答」的社群活動,里面沉淀了大量有價值的互動信息,后來因為各種原因終止了。今天和涂騰聊起來,覺得這些信息就這么沉寂了太浪費。所以就試著用python爬取了知識星球的內容。這個過程又學習了一些新的知識&#xff0…

HTML學習(1)

1、縮寫和首字母縮寫<abbr><acronym> <abbr title"etcetera">etc.</abbr> <acronym title"World Wide Web">WWW</acronym> 2、塊引用&#xff08;短&#xff09; <p>A: <q>B</q>C</p> 顯示結…

常用的7個SQl優化技巧

作為程序員經常和數據庫打交道的時候還是非常頻繁的&#xff0c;掌握住一些Sql的優化技巧還是非常有必要的。下面列出一些常用的SQl優化技巧&#xff0c;感興趣的朋友可以了解一下。1、注意通配符中Like的使用以下寫法會造成全表的掃描&#xff0c;例如&#xff1a;select id,n…

toolbar java_Java ToolBar.layout方法代碼示例

import org.eclipse.swt.widgets.ToolBar; //導入方法依賴的package包/類protected ToolBar createToolbar() {final ToolBar t new ToolBar(composite, SWT.FLAT | SWT.LEFT | SWT.HORIZONTAL | SWT.WRAP);final GridData d new GridData(SWT.FILL, SWT.TOP, false, false);…

Visual Studio常用的快捷鍵整理

微軟的開發工具Visual Studio作為DoNet開發者來說是必備神器&#xff0c;該開發工具內置了很多的開發快捷鍵&#xff0c;熟悉了這些開發快捷鍵&#xff0c;對于程序員來說事半功倍&#xff0c;所以在這里整理一下&#xff0c;版本是vs2012以上&#xff0c;目前小編列出了自己覺…

win7旗艦版6l打印機咋安驅動_在w7旗艦版上怎么安裝HPlaserjet6L打印機?

您好&#xff0c;感謝您選擇惠普產品。首先6L產品只有并口線&#xff0c;但是現在win 7 電腦基本都沒有并口&#xff0c;有可能是您使用了轉接usb設備&#xff0c;但是產品在出廠的時候會對產品作測試&#xff0c;測試的結果是不建議使用轉接設備或者是延長設備&#xff0c;以免…

收集一些工作中常用的經典SQL語句

作為一枚程序員來說和數據庫打交道是不可避免的&#xff0c;現收集一下工作中常用的SQL語句&#xff0c;希望能給大家帶來一些幫助&#xff0c;當然可能不全面&#xff0c;歡迎補充&#xff01;1、執行插入語句&#xff0c;獲取自動生成的遞增的ID值INSERT INTO SysRole (RoleN…

ascii modbus vc源碼_MODBUS ASCII及MODBUS RTU通訊

代碼片段和文件信息using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO.Ports;//串口using…

Asp.Net操作Cookie總結

一、什么是Cookie&#xff1f;Cookie是存儲在客戶端文件系統的文本文件或客戶端瀏覽器對話的內存中的少量數據。它主要用來跟蹤數據設置&#xff0c;例如&#xff1a;當我們要訪問一個網站網頁的時候&#xff0c;用戶請求網頁時&#xff0c;應用程序可能會首先檢查此用戶是否已…

java GUI怎么輸入_在Swing中創建Java GUI以進行表單輸入

好吧,我已經瀏覽了整個互聯網,但卻未能找到這個問題的答案,所以也許有人可以提供一些見解.我正在開發一個相對簡單的Java應用程序,它將取代目前用于系統訪問請求的Word文檔.它旨在允許表單輸入新的員工雇用信息 – 名稱,所需的訪問權限等.所以這是我的問題.嘗試使用所有文本字段…

Net中Session的用法

一、什么是Session&#xff1f;簡單來說&#xff0c;就是用戶與網站服務器建立的一個連接&#xff0c;服務器分配給一個編號。當一臺WWW服務器運行時&#xff0c;可能有若干用戶正在瀏覽運行在這臺服務器上的網站。當用戶首次與這臺WWW服務器創建連接的時候&#xff0c;它就和這…