`
solitary
  • 浏览: 71719 次
社区版块
存档分类
最新评论

Mysql 锁表 for update (引擎/事务)

阅读更多

http://www.cnblogs.com/bigfish--/archive/2012/02/18/2356886.html

 

Mysql 锁表 for update (引擎/事务)
因为之前用过oracle,知道利用select * for update 可以锁表。所以很自然就想到在mysql中能不能适应for update

来锁表呢。

学习参考如下

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例

) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。
举个例子:
假设有个表单products ,里面有id跟name二个栏位,id是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
SELECT * FROM products WHERE id<>&apos;3&apos; FOR UPDATE;
例4: (主键不明确,table lock)
SELECT * FROM products WHERE id LIKE &apos;3&apos; FOR UPDATE;
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

由上面的InnoDB 已经交易区块引出两个问题。

1. what is InnoDB?

MySQL是我们比较常用的一种数据库软件。它有着诸多的优点,如开源的,免费的等等。其实它还有一个很好的特点,

那就是有多种引擎可以供你选择。如果赛车手能根据不同的路况,地形随手更换与之最适宜的引擎,那么他们将创造奇

迹。然而目前他们还做不到那样便捷的更换引擎,但是我们却可以!
所谓知己知彼方可百战不殆,要想将它们发挥到极致,首先我们应该来认识一下MySQL提供给我们的这几种引擎。
一般来说,MySQL有以下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)。注意:不同的版本支持的引

擎是有差异的。

进一步:
如何查看MySQL的当前存储引擎?

一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看:

看你的mysql现在已提供什么存储引擎:
mysql> show engines;

以上说明我的mysql默认使用的InnoDB引擎,并且支持MyISAM,memory,archive,Mrg_myisam。

后面还跟着解释, InnoDB 的解释是:支持事务,行级别锁定,外键。

看你的mysql当前默认的存储引擎:
mysql> show variables like &apos;%storage_engine%&apos;;

 

你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;

其实这是一定的,因为我的mysql引擎就是InnoDB,默认情况下创建的表当前也是以InnoDB为引擎的喽

2. what is 交易区块?

参考:http://hi.baidu.com/cuihu0706/blog/item/1dd6ccb1621c355709230278.html

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如

说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文

章等等,这样,这些数据库操作语句就构成一个事务!
删除的SQL语句
delete from userinfo where ~~~
delete from mail where ~~
delete from article where~~
~~
如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一句,那么其后果是难以想象的!
但用事务处理。如果删除出错,你只要rollback就可以取消删除操作(其实是只要你没有commit你就没有确实的执行该

删除操作) 一般来说,在商务级的应用中,都必须考虑事务处理的!

MYSQL数据库从4.1就开始支持事务功能,据说5.0将引入存储过程^_^
先简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作

序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)
原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因

为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来

说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!
隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!
持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢

复!

MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束

,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!个人推荐使用第一种方

法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)

MYSQL5.0 WINXP下测试通过~ ^_^

mysql> use test;
Database changed
mysql> CREATE TABLE `dbtest`(
-> id int(4)
-> ) TYPE=INNODB;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> select * from dbtest
-> ;
Empty set (0.01 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dbtest value(5);
Query OK, 1 row affected (0.00 sec)

mysql> insert into dbtest value(6);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dbtest values(7);
Query OK, 1 row affected (0.00 sec)

mysql> rollback; //这里回滚了
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)

mysql>

 

 

既然已经知道了相关的知识,那么下面就用for update来锁定行,进行试验

以上例中student表为例,

1. 使用begin开始一个事务

2. 利用select * for update 锁定行,

3. 在新窗口中验证非选中行是否被锁定 ----未被锁定

4. 在新窗口中验证选中行是否被锁定 -----锁定,update语句在等待了一段时间后失败。

分享到:
评论

相关推荐

    Mysql(索引结构/事务/锁/MVCC/BufferPool/优化)总结

    对Mysql(索引结构/事务/锁/MVCC/BufferPool/优化)总结,包括重要知识点与面试点,xmind源文件

    MySQL锁类型以及子查询锁表问题、解锁1

    MySQL锁类型以及查询锁表问题、解锁MySQL中select * for update锁表的范围MySQL中select * for update锁表的问题由

    mysql锁表解表

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...

    mySQL事务处理

    关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System....

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    MySQL锁与事务脑图.pdf

    MySQL锁与事务知识脑图

    MYSQL 解锁与锁表介绍

    相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level ...

    mysql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果我们把autocommit关闭掉[autocommit = 0],...

    MySQL8.0锁机制和事务

    mysql的锁机制和事务

    MySQL中文参考手册.chm

    &lt;br/&gt;5.1 MySQL对ANSI SQL92 的扩充 &lt;br/&gt;5.2 以ANSI模式运行 MySQL &lt;br/&gt;5.3 MySQL相比ANSI SQL92的差别 &lt;br/&gt;5.4 MySQL 缺乏的功能&lt;br/&gt;5.4.1 子选择(Sub-selects) &lt;br/&gt;5.4.2 SELECT INTO TABLE &lt;br/&gt;5.4.3 事务...

    mysql odbc for MacOS 32/64位 驱动安装包

    mysql odbc for MacOS dmg驱动安装包 This Connector/ODBC is a standardized database driver for Mac OS X platforms 包含以下文件: mysql-connector-odbc-5.1.13-osx10.6-x86-32bit.dmg // osx10.6 32位 mysql-...

    mysql-connector for C/C++

    截止资源上传时间最新的mysql connector,里面包含了c/c++ for linux 32bit or 64bit、c/c++ for windows 32bit的mysql connector

    Mysql事务以及锁原理讲解.pdf

    Mysql事务以及锁原理讲解,方便大家了解mysql事务和锁的原理

    Mysql Update批量更新的几种方式

    通常情况下,我们会使用以下SQL语句来更新字段值: ...for x in xrange(10): sql = ''' UPDATE mytable SET myfield='value' WHERE other_field='other_value'; ''' 这种方法并没有什么任何错误,

    MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql&gt;show processlist; 参看sql语句 一般少的话 mysql&gt;kill thread_...

    Mysql联表update数据的示例详解

    在MySQL中,可以在 UPDATE语句 中使用JOIN子句执行跨表更新。MySQL UPDATE JOIN的语法如下: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition 更...

    最新全国行政区域编码及mysql数据库(省/市/区县/街道)

    4.城乡划分代码说明:mysql数据库,树结构存储。包括:编码;名称;全称;所属省,市,区县,街道;拼音首字母;城市类型(直辖市,省会);同级下排序;深度;城乡分类代码及经纬度。 5.三级地址:...

    MySQL锁和事务、InnoDB架构分析.zip

    MySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析.zipMySQL锁和事务、InnoDB架构分析....

    MySQL中update操作会自动加锁吗

    MySQL中update操作会自动加锁吗,看了就知道答案!!!

Global site tag (gtag.js) - Google Analytics