一、并发访问控制

实现的并发访问的控制技术是基于锁;

锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁;InnoDB支持表级锁和行级锁;

锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读;写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作;

锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁;

锁策略:在锁粒度及数据安全性寻求的平衡机制。

显式锁的使用方法:LOCK TABLES tbl_name READ|WRITE

MariaDB [school]> LOCK TABLES students READ;  #加读锁
MariaDB [school]> UNLOCK TABLES;  #解锁

读锁:任何人都不可写

写锁:自己可以读写,但是其他人不可读写

FLUSH TABLES tb_name :关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁

SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁

二、事务Transactions

​ 一组原子性的SQL语句,或一个独立工作单元

1、事务遵循ACID原则:

  • A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
  • C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
  • I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
  • D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

2、事务的生命周期

显式事务:明确的规定事务的开始

隐式事务:默认为隐式事务,每执行完一句语句后直接提交

autocommit = {OFF|ON} 开启或关闭自动提交,建议使用显式请求和提交事务,而不要使用“自动提交”功能

启动事务:START TRANSACTION;

插入标签:ROLLBACK TO ##;

撤销回指定标签:ROLLBACK TO ##;

全部撤销:ROLLBACK;

提交事务:COMMIT;

删除标签:RELEASE SAVEPOINT;

MariaDB [school]> START TRANSACTION;  #明确指明启动一个事务
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M'); #添加一条记录
MariaDB [school]> SAVEPOINT sp26; #插入一个标签
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F'); #再加入一条记录
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,可以看到刚刚插入的数据
+-------+-------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
| 27 | Maria | 12 | F | NULL | NULL |
+-------+-------+-----+--------+---------+-----------+
MariaDB [school]> ROLLBACK TO sp26; #撤销到sp26标签之前的状态
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,刚刚maria的信息被撤回了
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
+-------+------+-----+--------+---------+-----------+
MariaDB [school]> COMMIT; #提交事务
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #最终的数据
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
+-------+------+-----+--------+---------+-----------+

3、事务的隔离级别

  1. READ UNCOMMITTED 其他事务可以看到未提交的脏数据,产生脏读
  2. READ COMMITTED 提交后其他事务可以看到修改后的数据,每次读取的数据可能不一致,不可重复读
  3. REPEATABLE READ 可重复读,每次看到的数据都一致,数据被修改后看不到最新数据,会产生幻读(默认设置)
  4. SETIALIZABILE 未提交的读事务阻塞修改事务,串行执行,并发性差

MVCC: 多版本并发控制,和事务级别相关

修改事务隔离级别:服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置

tx_isolation

  • Description: The transaction isolation level. See also SET TRANSACTION ISOLATION LEVEL.
  • Commandline: --transaction-isolation=name
  • Scope: Global, Session
  • Dynamic: Yes
  • Type: enumeration
  • Default Value: REPEATABLE-READ
  • Valid Values: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
MariaDB [school]> SELECT @@tx_isolation;   #默认为可重复读级别
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
MariaDB [school]> SET tx_isolation='READ-UNCOMMITTED';
MariaDB [school]> set tx_isolation='READ-COMMITTED';
MariaDB [school]> set tx_isolation='REPEATABLE-READ';
MariaDB [school]> set tx_isolation='SERIALIZABLE';

4、死锁

​ 两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态会发生死锁

在A事务修改t1表的第3行,B事务修改t2表的第2行时;这时A事务去修改t2表的第2行,这时就把A事务阻塞了,然后B事务有刚刚好去修改t1表的第3行,这时B事务也被阻塞了,这时就产生了死锁。

俩个事务同时去更改对方的修改的表,互相阻塞;系统会发现死锁,会自动牺牲一个代价小的事务来解开死锁。

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

查看进程列表:MariaDB [school]> SHOW PROCESSLIST;

杀死进程:MariaDB [school]> KILL 5;

事务隔离实现并发控制:MySQL系列之十的更多相关文章

  1. MySQL常用配置和性能压力测试:MySQL系列之十五

    一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经 ...

  2. 备份与恢复:MySQL系列之十二

    一.备份策略赘述 1.备份的类型 类型1: 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备) 温备份:仅可以执行读操作 冷备份:离线备份,读写操作均中止 类型2: 物理备份:复制数 ...

  3. MySQL的高可用实现:MySQL系列之十四

    MySQL的高可以有三种实现方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp 一.MHA ...

  4. Mysql系列(十二)—— 索引下推优化

    索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...

  5. Mysql系列(十)—— 性能分析工具profiling

    转载自:http://www.ywnds.com/?p=8677 explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. ...

  6. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  7. mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理

    一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...

  8. Mysql事务隔离级别学习

    这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级 ...

  9. MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异

    MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...

随机推荐

  1. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)

    D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. stl_list.h

    stl_list.h // Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...

  3. mysql 常用的存储引擎MyISAM/InnoDB比较

  4. UVA12163 游戏

    题目大意 现在有两个人在一个n个结点的有向图上玩一个双人游戏,保证图中无环和自圈.游戏的规则如下:1.初始的时候$i$号点有一个正权值$value_i$2.两名玩家依次操作,每个玩家在当前回合可以选择 ...

  5. 1030 Travel Plan (30)(30 分)

    A traveler's map gives the distances between cities along the highways, together with the cost of ea ...

  6. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

  7. 安装ORACLE时在Linux上设置内核参数的含义

    前两天看到一篇Redhat官方的Oracle安装文档,对于Linux内核参数的修改描述的非常清晰. 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其 ...

  8. socket发送结构体

    struct send_info {char info_from[20]; //发送者IDchar info_to[20]; //接收者IDint info_length; //发送的消息主体的长度c ...

  9. java--序列化及其算法透析

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  10. DCloud-MUI:Hello MUI2

    ylbtech-DCloud: 1. <head> <meta charset="utf-8"> <title>Hello MUI</ti ...