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打不开表问题解决方案
做开发时候某一表怎么也打不开,数据也不多,网上查了按下面这篇文章完美解决,但是要记得用root登录mysql: 记一次MySQL中Waiting for table metadata lock的解决方 ...
- Web渗透测试笔记(基础部分)
信息收集: dns信息收集 格式:dns... -参数 域名 -参数 示例: root@xxSec:~# dnsenum baidu.com root@xxSec:~# dnsenum -f dns. ...
- MySQL Crash Errcode: 28 - No space left on device
一台MySQL服务器突然Crash了,检查进程 ps -ef | grep -i mysql 发现mysqld进程已经没有了, 检查错误日志时发现MySQL确实Crash了.具体如下所示: 注意日志中 ...
- 讯飞语音JavaWeb语音合成解决方案
在线语音合成 将文字信息转化为声音信息,给应用配上"嘴巴".我们提供了众多极具特色的发音人(音库)供您选择.其合成音在音色.自然度等方面的表现均接近甚至超过了人声.这种语音合成体验 ...
- 笔记+R︱信用风险建模中神经网络激活函数与感知器简述
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记源于CDA-DSC课程,由常国珍老师主讲 ...
- 【php】curl常见的错误号和解释
curl 错误代码列表 CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议. 可能是您没有使用的编译时选项造成了这 ...
- 使用EFI引导从硬盘(U盘)安装Win7的图文教程
目前仅支持vista后的64位系统 大部分使用EFI引导安装Win7的教程都是采用光盘启动安装,虽然光盘安装比较简单,但是对于没有光驱的朋友来说还是相当不便,更不用说光盘安装的两大缺点了,一速度慢,二 ...
- (十九)java小练习
练习1:计算13-23+33-43+--+993-1003的结果 package demo; /** * 计算13-23+33-43+--+993-1003的结果 * @author tu ...
- org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Linux显示本地端的文件系统
Linux显示本地端的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -l 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev/ ...