mysql批量語句,怎麼保證操作都成功?

2020-12-06 技術愛好者

今天就討論以下幾個數據批量操作的問題

在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢對於大數據表,線上更新而不影響用戶使用事務與鎖的關係建立測試表member#MYSQL#

表結構

1. 在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢

第一種情況:先看一下,多條語句沒有事務控制的代碼

$conn = Yii::$app->db1;

$sql1 = 'insert into member (name,password) values ("yang","vincent")';

$sql2 = 'insert into member (name,password,gender) values ("yang","vincent1")';

$conn->createCommand($sql1)->execute();

$conn->createCommand($sql2)->execute();

執行結果怎麼呢 ,下面我們來看看,結果大家也猜得到,報錯了

SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row.....

欄位不匹配,但是,數據表第一條已經插入成功,只是第二條語句出錯了!

第二種情況:多條語句,有事務控制

測試代碼如下:

$conn = Yii::$app->db1;

$transaction = $conn->beginTransaction();

try {

$sql1 = 'insert into member (name,password) values ("yang","vincent")';

$sql2 = 'insert into member (name,password,gender) values ("yang","vincent1")';

$conn->createCommand($sql1)->execute();

$conn->createCommand($sql2)->execute(); // ... executing other SQL statements ...

$transaction->commit();

} catch (Exception $e) {

$transaction->rollBack();

}

結果同樣出錯,錯誤信息和第一種情況一致,但是這次數據表一條記錄也沒有,不難理解,我們都知道,在一個事務中,多個操作,要麼都失敗,要麼都成功。

第三種情況:一條語句,批量插入,有事務控制

測試代碼如下:

$sql1 = 'insert into member (name,password) values ("yang","vincent"),("yang","lily",1)';

$conn->createCommand($sql1)->execute();

$transaction->commit();

執行代碼出錯,錯誤和上面情況一致,數據表一條也沒有寫入成功,所以批量操作的sql語句是原子性的操作,相當於事務 控制。

總結:

在進行批量插入時,要麼都成功,要麼都失敗,比如:在一個有唯一性索引的表批量插入時,只要有一個重複,整個操作都會失敗,並不是部分成功,部分失敗,在實際開發中要注意!

2. 大數據表,如何做到線上更新而不影響用戶使用

我們的應用上線以後,功能在不停的迭代更新,數據表難免會修改,當數據量很大時,進行table更新,如修改表結構、增加欄位、修改欄位值、加索引,這些操作肯定會對用戶有影響的。

比如增加索引,一張表千萬數量級,可能會卡住幾十分鐘或長達幾個小時。

常用的方法是:

在測試環境測試修改的影響,如果是幾分鐘,可以直接在線修改,如果時間長則不行

選一個用戶使用最少的時間,停服更新;這應該是最常用的方法,這也是程序猿苦逼的原因,經常要熬夜功能上線。

業界的其他方案,也只有大公司能玩得轉:

fecebook自己開發的工具,地址

http://bazaar.launchpad.net/~mysqlatfacebook/mysqlatfacebook/tools/files/head:/osc

也是8年前的版本,沒有更新過了,只適用於mysql5.0,5.1 ,用php寫的腳步,有興趣的可以看一下,也許有借鑑意義;

像BAT這些大公司內部應該都有自己研發的工具,畢竟他們更有這些需求,技術大牛也多!

在線表結構的在線修改是一個業界難題!

3. 事務與鎖的關係

事務中會不會加鎖?

事務加不加鎖,和事務的隔離級別有關,隔離級別中的可重複讀和串行化,本身事務已經完全隔離了,所以事務內操作就沒必要加鎖了。

事務本身並不加鎖,加不加鎖取決於執行的語句,一旦加鎖直到事務提交或 回滾才會釋放。

事務的作用是什麼?

事務保證操作的完整性,如訂單和庫存的操作,但不保證數據的正確性,如 update goods set num=num-1 where goods_id=1,所以這樣不能保證超賣情況!還需要鎖機制。

鎖的作用是什麼?

鎖是避免並發的操作導致數據破壞,導致結果不是預期,常用在一些數據敏感的場合!

相關焦點

  • MySQL批量操作語句,會部分成功嗎?
    今天就討論以下幾個數據批量操作的問題1. 在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢2. 對於大數據表,線上更新而不影響用戶使用3.在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢第一種情況:先看一下,多條語句沒有事務控制的代碼$conn = Yii::$app->db1; $sql1 = &34;yang&34;vincent&39;; $sql2 = &34;yang&34;vincent1&39;;
  • MySQL批量操作及XBK安裝簡介
    本文介紹MySQL批量操作及XBK安裝簡介。批量操作以下語句只能在屏幕顯示出拼接後的語句,但是無法導入到文件中select concat("alter table ",table_schema," ",table_name," discard tablespace;") from information_schema.tables
  • 揭秘Mysql事物部分update語句成功,部分失敗
    使用mysql資料庫的小夥伴們,對mysql怎麼控制事物,語句的提交一定要了解清楚,如果應用代碼對事物使用不當,就會造成Mysql事物部分update語句成功,部分失敗。下面就詳細解釋其產生的原因首先說一個mysql的事務提交的參數這個參數很好理解,如果autocommit設置為1,就是開啟mysql資料庫自動提交的特性,設置為0,則不開啟自動提交。這裡需要提醒大家的是,設置為1之後,資料庫自動提交的意思,每當應用請求一個update,或者insert,或者delete語句時,Mysql就會提交這個語句。
  • MySQL實戰中,Insert語句的使用心得總結
    發現用批量插入的方法可以顯著提高速度。0.046s 這相當於插入一兩條數據的速度,所以用批量插入會大大提升數據插入速度,當有較大數據插入操作是用批量插入優化批量插入的寫法::註:但是當批量操作數據量很大的時候。
  • 通過shell腳本批量操作mysql資料庫
    創建建表語句=============================================  學生表:Student(Sno,Sname,Ssex,Sage,Sdept)  -(學號-主鍵,姓名,性別,年齡,
  • MySQL批量替換指定欄位字符串SQL語句
    【IT168 技術】MySQL批量替換是我們經常會用到的功能,有時站內包含敏感詞,會給我們帶來麻煩,而在信息量較大的情況下,一篇篇查找、修改是不現實的。  用MySQL批量替換,甚是輕鬆。發布在這裡供參考,以備不時之需。
  • MySQL資料庫的分組操作,語句拼接,列轉行操作
    本文介紹MySQL資料庫的分組操作,語句拼接,列轉行操作。關於group by 的sql_mode關於group by 的sql_modeonly_full_group_by說明:僅是MySQL5.7中存在,5.6和8.0都沒有,查看sql_mode
  • mysql修改語句UPDATE的使用
    今天介紹一下update的使用,這個關鍵詞就是修改資料庫語句。我們看看在哪些環境會用到修改語句,比如在編輯輸入資料的時候發現資料錄錯了,或者某個信息要修改,這個時候就需要用到update了。我們實現的是最後原理,不管是asp,jsp還是php實現最底層都是通過sql語句修改資料庫,實現達到的效果。通過程序篩選出數據,在指定去執行。
  • MySQL的一條SQL語句是怎麼執行的?
    Server層包括連接器,查詢緩存,分析器,優化器和執行器等,涵蓋MySQL的大多數核心服務功能以及所有的內置函數(如日期,時間,數學等),所有的的跨存儲引擎的功能都在這一層實現(如存儲過程,觸發器,試圖等)。存儲引擎負責存儲存儲數據和提取數據。
  • WordPress如何使用SQL語句批量操作(2)
    請參考WordPress如何使用SQL語句批量操作(1)你是否遇到過如下幾種狀況:    博客更換域名,博客文章的內容也要跟著換    使用的圖片地址更換了    寫了很多文章,回過頭來想切換作者    想刪除某個可惡留言者的所有留言    想更改某個留言者所有留言的網站URL    想要禁用所有文章的
  • MYSQL資料庫操作案例
    Enter password:******mysql> use RUNOOB;Database changedmysql>注意:所有的資料庫名,表名,表欄位都是區分大小寫的。, 但是你再進行刪除表操作時要非常小心,因為執行刪除命令後所有數據都會消失。
  • 怎麼修改Mysql數據表中的視圖
    本篇文章主要給大家介紹mysql數據表中怎麼進行修改視圖的操作。通俗的說,視圖是由SELECT語句組成的查詢定義的虛擬表,也就是由一張或多張表中的數據組成的。視圖就如同mysql基本表一樣,對表能夠進行的一般操作都可以應用於視圖,比如創建,查詢,插入,修改,刪除操作等。下面我們就結合簡單的示例給大家繼續介紹mysql視圖的修改操作。其實視圖的修改就相當於SQL語句的修改。首先我們可以通過cmd命令行工具連接mysql資料庫。
  • python3.8操作(插入,刪除)mysql/MariaDB資料庫
    01主題大家好,我是義縣遊學電子科技.今天來跟大家說一個工作中常用到的操作,python3.8操作MariaDB資料庫.因為MariaDB屬於mysql分支因此資料庫命令語句都是通用的非常方便.print("插入成功:")except:print("發生插入錯誤")04代碼解析首先我們先安裝操作mysql/Mariadb的資料庫驅動包mysql-connector,使用命令pip install mysql-connector即可.要在管理員權限下打開
  • MYSQL 連接查詢算法:JOIN語句在 MYSQL 內部到底是怎麼執行的
    其實這涉及到 join 語句在 MYSQL 內部到底是怎麼執行的。這就是我們今天要講的內容。該操作能將內部表讀取次數減少一個數量級。但是 BNL 算法的這 10 萬次判斷是在內存中操作,所以速度會更快,性能會更好。有些人看到這塊,可能又有疑惑了,Simple NLJ 也是在內存中比較的啊,而且都是比較了 10 萬次,為什麼 BNL 會更快呢?
  • MySql 入門到精通-sql查詢語句的執行過程,你真的知道嗎?
    如下sql 查詢:mysql> select * from T where ID=10;對於這條查詢語句,我們再腦海裡面肯定能知道它能返回 T 表內 ID=10 的數據,但是,我們並不知道它在 MySQL 內部是怎麼執行的。
  • python的mysql資料庫操作
    前言上一篇文章我們一起學習了MySQLdb模塊的安裝和資料庫連接,連接了資料庫以後就可以執行資料庫的各種語句了,今天我們再接著學習資料庫的sql語句操作。python的mysql資料庫執行sql語句1.獲取mysql版本#!
  • 編程中最實用和不得不會的操作:Python如何操作redis和mysql
    人生苦短,我用Python我們大家已經對資料庫和redis的一些基本操作都比較的熟悉了,那麼今天我們來學習一下怎麼用Python怎麼操作MySQL資料庫和redis的呢?這也就是我為什麼前幾天都在寫MySQL和redis的基本操作,我們廢話不多說,開始我們今天的內容吧開發工具:IDLE (Python 3.7 64-bit或者32-bit) , pycharm(professional的版本), Ubuntu,xshell6(註:不需要3.7版本的也行,只需要Python3的版本都可以)1.MySQL和redis設置外部連接
  • MySQL數據操作(DML)語句,入門掌握這些足夠了
    value ('dony', 1000); mysql> insert into emp(ename,sal) value ('dony', 1000);mysql> select * from emp;+-+--+--+--+----+---+| age | ename | birth | hiredate | sal | deptno |+-+--+--+--+---
  • 怎麼判斷你的MySQL到底是讀多還是寫多
    我就很納悶,他們是怎麼判斷出來資料庫的讀多寫少的呢?其實更多的時候是人云亦云,拍腦門罷了~ 下面就告訴大家正確的姿勢笨方法(不準確)查看自己項目內的所有sql語句,去做個統計,到底是select語句多,還是insert、update、delete語句多。
  • Python操作MySQL基本環境搭建及增刪改查實現
    首先下載mysql-5.6.33-winx64( 下載地址 ),mysql5.7以上版本在安裝的過程中會出現一些問題,所以本人選擇了5.6版本。安裝的過程一直下一步就行; 然後配置系統環境變量。