1.下载Mysql并安装,我喜欢不用安装的zip版,cd到bin目录下,先修改下mysql的密码.

mysqladmin -u root -p password mysql ,第一次运行并修改mysql的密码为mysql,注册mysqld服务,mysqld -install

2.四种数据不一致性的问题

1)       丢失或覆盖更新(lost update)

当两个或多个事务选择同一数据,并且基于最初选定的值更新该数据时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。上面预定飞机票的例子就属于这种并发问题。事务1与事务2先后读入同一数据A=16,事务1执行A-1,并将结果A=15写回,事务2执行A-1,并将结果A=15写回。事务2提交的结果覆盖了事务1对数据库的修改,从而使事务1对数据库的修改丢失了。
(2)    脏读
一个事务读取了另一个未提交的并行事务写的数据。当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。换句话说,当事务1修改某一数据,并将其写回磁盘,事务2读取同一数据后,事务1由于某种原因被撤销,这时事务1已修改过的数据恢复原值,事务2读到的数据就与数据库中的数据不一致,是不正确的数据,称为脏读。
例如,在下图中,事务1将C值修改为200,事务2读到C为200,而事务1由于某种原因撤销,其修改作废,C恢复原值100,这时事务2读到的就是不正确的“脏“数据了。
(3)    不可重复读(nonrepeatable read)
一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。即事务1读取某一数据后,事务2对其做了修改,当事务1再次读数据时,得到的与第一次不同的值。
(4)    幻像读
如果一个事务在提交查询结果之前,另一个事务可以更改该结果,就会发生这种情况。这句话也可以这样解释,事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2删除了其中部分记录,事务1再次按相同条件读取数据时,发现某些记录神秘地消失了;或者事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。

3.数据库的隔离级别

===========================================================================================
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
=========================================================================================== 未提交读(Read uncommitted) 可能 可能 可能 已提交读(Read committed) 不可能 可能 可能 可重复读(Repeatable read) 不可能 不可能 可能 可串行化(Serializable ) 不可能 不可能 不可能 =========================================================================================== ·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 ·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读) ·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 ·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.新建一个表(testTx),测试Transaction,并插入一行数据

CREATE TABLE testTx (
id int(8) primary key auto_increment,
version int(8)
);
insert into testTx values (1,1);

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+-----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+-----------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+-----------------+

查看Mysql的默认的隔离级别是REPEATABLE-READ.

为什么叫可重复读的隔离级别,就是因为在此种隔离级别下,可以避免不可重复读的问题。

T1 T2

set autocommit=0;

begin;//开始事务

set autocommit=0;

begin;//开始事务

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 1 |
+----+---------+


 
mysql> update testTX set version =2 where id =1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from testisolatio;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
1 row in set (0.00 sec)

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 1 |
+----+---------+

【说明】
T2未提交,看到数据不变,无脏读。

 
   commit;

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 1 |
+----+---------+

【说明】
T2提交,看到数据依旧变,说明可以重复读。

 
 commit;  

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+

事务提交之后,看到数据改变

 
   

以上就是mysql的可重复读隔离模式下的两个事务的执行过程,我们再来看在REPEATABLE-READ模式下的幻读问题。

Session1 Session2
begin; begin;
mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
 
 

INSERT INTO teseTX VALUES (2, 1);

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
Session2 未提交,依然是可重复读
 
  commit;
mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
Session2 已提交,数据依然和之前读出来一样.但是幻读问题依然有
 

INSERT INTO teseTX VALUES (2, 1);

ERROR 1062 (23000):
Duplicate entry '1' for key 1

(shit, 刚刚明明显示只有id=1的记录),这里出现了幻读

 
 commit;  

mysql> select * from testTx;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
| 2 | 1 |
+----+---------+
最终显示了
 

但是Mysql提供了在REPEATABLE-READ模式下解决幻读的问题。

http://dev.mysql.com/doc/refman/5.0/en/innodb-next-key-locking.html
To prevent phantoms, InnoDB uses an algorithm called next-key locking that combines index-row locking with gap locking. InnoDB performs row-level locking in such a way that when it searches or scans a table index, it sets shared or exclusive locks on the index records it encounters. Thus, the row-level locks are actually index-record locks. In addition, a next-key lock on an index record also affects the “gap” before that index record. That is, a next-key lock is an index-record lock plus a gap lock on the gap preceding the index record. If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.

再看一个实验,要注意,表TesetTX里的id为主键字段。实验三:

   
begin; begin;

mysql> select * from testTX where id<2 for update;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
1 row in set (15.84 sec)

 
 

INSERT INTO teseTX VALUES (3, 1);
Query OK, 1 row affected

mysql> select * from testTX where id<2 for update;
+----+---------+
| id | version |
+----+---------+
| 1 | 2 |
+----+---------+
1 row in set (15.84 sec)
 
 

mysql> select * from testTX where id<=1 for update;

(waiting for lock ... then timeout)
 ERROR 1205 (HY000): Lock wait timeout exceeded;
 try restarting transaction

   commit;
 commit;  

mysql> select * from testTX;
+----+---------+
| id | version |
+----+---------+
| 1 | 2           |
+----+---------+

| 2 | 1           |
+----+---------+

| 3 | 1          |
+----+---------+
1 row in set (15.84 sec)

 
   

可以看到,用id<2加的锁,只锁住了id<2的范围,可以成功添加id为3的记录,但一旦想要获得select id<=1,就会阻塞,等待。

MySQL InnoDB的可重复读并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是next-key locks。

Mysql讲解数据库并发控制知识的更多相关文章

  1. mysql数据库相关知识

    什么是数据库?                数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...

  2. 数据库相关知识积累(sqlserver、oracle、mysql)

    数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库  分离 2. USE master GO ALTER DAT ...

  3. MySQL/MariaDB数据库的并发控制

    MySQL/MariaDB数据库的并发控制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发控制概述 1>.什么是并发控制 MySQL是一个服务器级别的数据库,它通常 ...

  4. 阿里面试官必问的12个MySQL数据库基础知识,哪些你还不知道?

    数据库基础知识 1.为什么要使用数据库 (1)数据保存在内存 优点: 存取速度快 缺点: 数据不能永久保存 (2)数据保存在文件 优点: 数据永久保存 缺点: 1)速度比内存操作慢,频繁的IO操作. ...

  5. MySQL数据库基础知识及优化

    MySQL数据库基础知识及优化必会的知识点,你掌握了多少? 推荐阅读: 这些必会的计算机网络知识点你都掌握了吗 关于数据库事务和锁的必会知识点,你掌握了多少? 关于数据库索引,必须掌握的知识点 目录 ...

  6. Mysql数据库基础知识

    什么是Mysql数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQ ...

  7. 数据库基础知识详解三:MVCC、范式以及表连接方式

    写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正. 8.MVCC 多版本并发控制(Multi-Versi ...

  8. 浅谈数据库并发控制 - 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...

  9. MySQL主从数据库同步延迟问题解决(转)

    最近在做MySQL主从数据库同步测试,发现了一些问题,其中主从同步延迟问题是其中之一,下面内容是从网上找到的一些讲解,记录下来以便自己学习: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务 ...

随机推荐

  1. ES6-函数扩展

  2. 4.2springmvc校验

    1.hibernate的校验框架validation所需要jar包: 2 在applicationContext.xml中配置校验器: <!-- 校验器 --> <bean id=& ...

  3. MATLAB格式化输出控制 分类: 数学 2015-07-31 23:01 3人阅读 评论(0) 收藏

    MATLAB格式化输出控制 format 默认格式 format short 5字长定点数 format long 15字长定点数 format short e 5字长浮点数 format long ...

  4. OnItemSelectedListener事件与二级联动

    一.界面 1.新建province.xml件. 在“res/values”位置新建province.xml文件. (1)province.xml文件位置如下图所示: (2)province.xml内容 ...

  5. PHP太怪了,in_array() ,strpos,

    PHP中在某个字符中查找另外一个字符串,是否存在,用的是strpos,此函数用法,经常很多人用反了,正确的用法是strpos(string,search),strstr等,前面是原字符串,后面是要在原 ...

  6. IOS中打开应用实现检查更新的功能

    //检查更新页面 - (void)Renew{        NSDictionary *infoDic = [[NSBundle mainBundle]infoDictionary];        ...

  7. kuangbin_ShortPath M (POJ 1062)

    提出了一个错误的算法 以为能优化到只运行两次dij 然而我还是too naive 还是乖乖dij n 次吧... #include <iostream> #include <stri ...

  8. Android——文件的保存和读取

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...

  9. Java 学习

    effective+java第三版 2016-09-23 15:25 effective+java第三版 相关问答 EffectiveJava第28条中关于泛型的一个疑问? @又名耶稣谢邀 一.先说说 ...

  10. dump java

    http://www.gamlor.info/wordpress/2011/09/visualvm/ https://visualvm.java.net/zh_CN/gettingstarted.ht ...