乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Mysql 中select * from table where …... for update的用法

       茫茫V 2014-10-11

       由于InnoDB預(yù)設(shè)是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執(zhí)行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執(zhí)行Table Lock (將整個資料表單給鎖住)。

      舉個例子: 假設(shè)有個表單t,里面有id跟name二個欄位,id是主鍵。 CREATE TABLE t (

      id int(11) NOT NULL DEFAULT '0',

      name varchar(255) DEFAULT NULL,

      PRIMARY KEY (id)

      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      例1: (明確指定主鍵,并且有此筆資料,row lock) 窗口一:
      mysql> begin;
      Query OK, 0 rows affected (0.00 sec)
      mysql> select * from t where id = 1 for update;

      id name
      1 bingo

      1 row in set (0.00 sec)

      窗口二:

      mysql> select * from t where id = 1;

      id name
      1 bingo

      1 row in set (0.01 sec)

      mysql> update t set name = 'xxm' where id = 2;

      Query OK, 1 row affected
      (0.08 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'icey' where id = 1;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      由此可見,當(dāng)明確指定主鍵,并且有此資料時,鎖的是where后面的記錄,即這里的id= 1; 接下來來看下沒有此資料的情況下會不會被鎖。

      例2: (明確指定主鍵,若查無此筆資料,無lock)

      窗口1:
      mysql> begin;

      Query OK, 0 rows affected (0.00 sec)

      mysql> select * from t where id = 11 for update;

      Empty set (0.00 sec)

      窗口2:

      mysql> update t set name = 'qweq' where id = 1;

      Query OK, 1 row affected (0.04 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'qw' where id = 2;

      Query OK, 1 row affected (0.06 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'vqw' where id = 3;

      Query OK, 1 row affected (0.05 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'vqws' where id = 4;

      Query OK, 1 row affected (0.04 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'vqs' where id = 5;

      Query OK, 1 row affected (0.03 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> update t set name = 'vqs' where id = 11;

      Query OK, 0 rows affected (0.00 sec)

      Rows matched: 0 Changed: 0 Warnings: 0

      mysql> select * from t;

      +----+------+

      id name
      1 qweq
      2 qw
      3 vqw
      4 vqws
      5 vqs

      由此得出結(jié)論,在沒有此資料的情況下,即使你for update也是不鎖的

      例2: (無主鍵,table lock)
      窗口1:
      mysql> select * from t where name ='qweq' for update;

      id name
      1 qweq

      1 row in set (0.00 sec)

      窗口2:

      mysql> update t set name = 'vqs' where id = 1;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      mysql> update t set name = 'vqs' where id = 2;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      由此可見,沒有明確主鍵的情況下鎖全表;

      例3: (主鍵不明確,table lock)

      SELECT * FROM products WHERE id<>'3' FOR UPDATE;
      窗口1:

      mysql> select * from t where id <> 2 for update;

      id name
      1 qweq
      3 vqw
      4 vqws
      5 vqs

      4 rows in set (0.00 sec)

      窗口2:
      mysql> update t set name = 'vqs' where id = 1;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      mysql> update t set name = 'vqs' where id = 2;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      在主鍵不明確的情況下,鎖全表

      例4: (主鍵不明確,table lock)

      窗口1:
      mysql> begin;

      Query OK, 0 rows affected (0.00 sec)

      mysql> select * from t where id like 3 for update;

      id name
      3 vqw

      1 row in set (0.00 sec)

      窗口2:

      mysql> update t set name = 'vqs' where id = 1;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      mysql> update t set name = 'vqs' where id = 2;

      ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

      鎖全表

      注1: FOR UPDATE僅適用于InnoDB,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多