15.1 事务概述

  当多个用户访问同一份数据,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另一个一致性状态,使用事务处理是非常必要的。

  事务有以下4个特性:

  1. 原子性:事务中所有的操作都视为一个原子单元,即对于事务所进行的数据修改等操作只能是完全提交或者完全回滚。
  2. 一致性:事务在完成时,必须使所有数据从一个一致性状态变为另一个一致性状态,所有的变更都必须应用于事务的修改,以确保数据的完整性。
  3. 隔离性:一个事务的操作语句所做的修改必须与其他事物的操作语句所做的修改相隔离,当前事务不会查看由另一个并发事务正在修改的数据。这种机制通过锁机制实现。
  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)两类。

意向锁表示一个事务有意对数据上共享锁或排它锁。

MySQL锁兼容情况说明
参数 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数据库学习十五 事务的更多相关文章

  1. MYSQL数据库学习十八 数据库维护和性能提高

    18.1 数据备份 可能造成数据损失的原因有: 存储介质故障:保存数据库文件的磁盘设备损坏,用户没有数据库备份导致数据彻底丢失. 用户的错误操作:如误删了某些重要数据,甚至整个数据库. 服务器的彻底瘫 ...

  2. MYSQL数据库学习十六 安全性机制

    16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...

  3. MYSQL数据库学习十四 存储过程和函数的操作

    14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...

  4. MYSQL数据库学习十二 使用MySQL运算符

    12.1 算术运算符 + - * /(DIV) %(MOD) 12.2 比较运算符 > < = <=> != <> >= <= BETWEEN AND ...

  5. MYSQL数据库学习十 单表数据记录查询

    10.1 简单数据记录查询 SELECT field1,field2,...fieldn FROM table_name; “*” ——查询所有记录 SELECT * FROM table_name; ...

  6. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

随机推荐

  1. Math.round(11.5)等于多少? Math.round(-11.5)等于多少?

    1.先说下怎么理解 round()方法可以这样理解: 将括号内的数+0.5之后,向下取值, 比如:round(3.4)就是3.4+0.5=3.9,向下取值是3,所以round(3.4)=3; roun ...

  2. Bind、Apply、Call三者的区别

    1)bind与apply.call 的最大区别就是:bind不会立即调用,其他两个会立即调用 var fn = { _int: function(){return 3}, fun: function( ...

  3. C#扩展方法类库StringExtensions

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 小白学爬虫-批量部署Splash负载集群

    整体目录如下: study@study:~/文档/ansible-examples$ tree Splash_Load_balancing_cluster Splash_Load_balancing_ ...

  5. C#的动态链接库和XML配置

    今天对昨天的实例进行了改进和提高,将堆排序和冒泡排序封装在一个动态链接库中,提供函数调用和事件委托.此外加入XML进行配置,在XML中存入相关配置信息,提供一个单独的XmlClass对其进行操作,加深 ...

  6. Visio如何调整锁定图像大小

    在Visio中,比如模板中的UML类图,是不可调整大小的,这可能给我们设计图片带来了一些不便之处,如下图: 可以看到其边框是显示锁定状态无法修改的,当我们在左下角修改器长宽时,也会出现不可修改的情况. ...

  7. 异常-----java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.core.KeyFactory

    SSH 类库问题 java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer2009- ...

  8. ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction

    1.Action.RenderAction加载办法的视图,履行Controller → Model → View的次序,然后把产生的页面带回到本来的View中再回传.而Partial.RenderPa ...

  9. ASP.NET WebForm 通过 PagedDataSource 实现 Repeater 的分页

    1.效果图&代码说明   1.效果图     2.代码说明 1.翻页按钮         前台两个LinkButton(上一页.下一页),设置不同的CommandName.CommandArg ...

  10. [ZJOI2007]时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...