MYSQL数据库学习十五 事务
15.1 事务概述
当多个用户访问同一份数据,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另一个一致性状态,使用事务处理是非常必要的。
事务有以下4个特性:
- 原子性:事务中所有的操作都视为一个原子单元,即对于事务所进行的数据修改等操作只能是完全提交或者完全回滚。
- 一致性:事务在完成时,必须使所有数据从一个一致性状态变为另一个一致性状态,所有的变更都必须应用于事务的修改,以确保数据的完整性。
- 隔离性:一个事务的操作语句所做的修改必须与其他事物的操作语句所做的修改相隔离,当前事务不会查看由另一个并发事务正在修改的数据。这种机制通过锁机制实现。
- 持久性:事务完成之后,所做的修改对数据的影响是永久的,即使系统重启或者出现系统故障数据仍可以恢复。
15.2 MySQL事务控制语句
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
15.3 MySQL事务隔离级别
SQL定义了4种隔离级别,指定了事务中哪些数据改变其他事务可见,哪些数据改变其他事务不可见。低级别的隔离级别可以支持更高的并发处理,同时占用的系统资源更少。
SET [SESSION | GLOBAL] TRANSACTION
ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
1. READ UNCOMMITTED (读取未提交内容)
所有事务都可以看到其他未提交事务的执行结果。因为其性能也不比其他级别高很多,因此此隔离级别实际应用中一般很少使用,读取未提交的数据称为脏读(Dirty Read)。
2. READ COMMITTED (读取提交内容)
这是大多数数据库系统的默认隔离级别,但不是MySQL默认的隔离级别。这种隔离级别支持所谓的不可重复读(Nonrepeatable Read)。
3. REPEATABLE READ (可重读)
这是MySQL的默认事务隔离级别,能确保同一个事务的多个实例在并发读取数据时,会看到同样的数据行,理论上会导致另一问题:幻读(Phantom Read)。InnoDB存储引擎通过多版本并发控制(MVCC)机制解决了该问题。
4. SERIALIZABLE (可串行化)
这是最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,是在每个读的数据行加上共享锁实现。在这个级别,可能会导致大量的超时现象和锁竞争,一般不推荐使用。
15.4 InnoDB锁机制
15.4.1 锁的种类
1. 共享锁 S
锁粒度是行或元组(多行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。
2. 排它锁 X
锁粒度是行或元组(多行)。一个事务获取了排他锁之后,可以对锁定范围内的数据执行写操作。
3. 意向锁 IS IX
意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)两类。
意向锁表示一个事务有意对数据上共享锁或排它锁。
| 参数 | X | S | IX | IS |
| X | N | N | N | N |
| S | N | Y | N | Y |
| IX | N | N | Y | Y |
| IS | N | Y | Y | Y |
Y表示兼容,N表示互斥。
15.4.2 锁的粒度
表锁:管理锁的开销最小,同时允许的并发量也是最小。MyISAM存储引擎使用该锁机制。当要写入数据时,把整个表记录被锁,此时其他读、写动作一律等待。同时一些特定的动作,如ALTER TABLE执行时使用表锁。
行锁:可以支持最大的并发。InnoDB存储引擎使用该锁机制。如果要支持并发读/写,建议采用行级锁,可以获得更多的更新性能。当开启一个事务时,InnoDB存储引擎会在更新的记录上加上一个行级锁,此时其他事务不可以更新被锁定的记录。
MYSQL数据库学习十五 事务的更多相关文章
- MYSQL数据库学习十八 数据库维护和性能提高
18.1 数据备份 可能造成数据损失的原因有: 存储介质故障:保存数据库文件的磁盘设备损坏,用户没有数据库备份导致数据彻底丢失. 用户的错误操作:如误删了某些重要数据,甚至整个数据库. 服务器的彻底瘫 ...
- MYSQL数据库学习十六 安全性机制
16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...
- MYSQL数据库学习十四 存储过程和函数的操作
14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...
- MYSQL数据库学习十二 使用MySQL运算符
12.1 算术运算符 + - * /(DIV) %(MOD) 12.2 比较运算符 > < = <=> != <> >= <= BETWEEN AND ...
- MYSQL数据库学习十 单表数据记录查询
10.1 简单数据记录查询 SELECT field1,field2,...fieldn FROM table_name; “*” ——查询所有记录 SELECT * FROM table_name; ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
随机推荐
- mysql 集群 监控
部署mysql高可用集群(mysql-mmm+主从同步)4台数据库服务器:四个数据库之保留初始的四个库,其他库全部删除 主机158 主机137 主机99 主机67 主机102(可与其他四台ping通即 ...
- VxWorks 操作系统内存布局
在VxWorks操作系统过程中可能使用到的BootRom和VxWorks内核映像本身都可以存在两种方式:压缩的和非压缩的. 1.非压缩形式 如果没有进行压缩,则只有一次重定位,即从ROM到RAM只存在 ...
- HighCharts之2D回归直线的散点
HighCharts之2D回归直线的散点 1.实例源码 ScatterLine.html: <!DOCTYPE html> <html> <head> <me ...
- Linux 显示权限
Linux 显示权限 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -lh 总用量 56K -rw-r--r-- 1 youhaidong youhai ...
- BOM(浏览器对象模型)的一些操作
一个完整的JavaScript实现由三部分组成: ECMAScript:核心,定义语言基础,规定了语言的组成部分(语法,类型,关键字,保留字,对象等) DOM:文档对象模型,·DOM把整个页面映射成一 ...
- Python基础__Python序列基本类型及其操作(1)
本节考虑的Python的一个中要的内置对象序列, 所谓的序列即一个有序对象的集合.这里的对象可以是数字.字符串等.根据功能的不同将序列分为字符串.列表.元组,本文将以下这几种对象做一些介绍. 一. 字 ...
- 【Luogu2444】病毒(AC自动机)
[Luogu2444]病毒(AC自动机) 题面 洛谷 题解 如果存在一个无限长的串 证明可以在\(AC\)自动机上找到一个环 然后在上面可以无限跳 所以构建\(AC\)自动机 在上面跑\(dfs\)就 ...
- [BZOJ1385] [Baltic2000] Division expression (数学)
Description 除法表达式有如下的形式: X1/X2/X3.../Xk 其中Xi是正整数且Xi<=1000000000(1<=i<=k,K<=10000) 除法表达式应 ...
- Django的models实现分析
1 引子 1.1 神奇的Django中的models 我们先来看一段在Django项目中常用的代码: 设置数据库models代码: class Students(models.Mod ...
- Vue2.0 demo:百度百聘第三方web客户端
github地址:https://github.com/axel10/baipin_vue 项目地址:https://vcollection.org/baipin/ 官方的百度百聘客户端存在翻页时过滤 ...