MySQL事务概述

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。

http://www.cnblogs.com/shijiaqi1066/p/3858050.html

1 事务(Transaction)概述

1.1 数据库事务的四个特性:ACID

原子性(Atomicity)

整个事务中的所有操作,要么全部完成,要么全部不完成。

一致性(Consistency)

数据库一致性(Database Consistency)是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性(Isolation)

又称为孤立性。多个人执行多个事务,事务需要隔离。即事务不能同时进行。

持久性(Durability)

保证即便断电,也能正常工作。

1.2 事务的分类

扁平事务

最典型的事务,由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作都是原子的。要么执行,要么回滚。

带有保存点的事务

在基于扁平事务的基础上,允许在事务执行过程中回滚到事务中较早的一个状态。

链事务

保存点事务的一种变种。保存点事务在系统崩溃时,所有的保存点都是易失的,即系统恢复时,事务需要从开始出重新执行,而不能从最近的保存点继续执行。

链事务指的是在提交事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。提交事务和开始下一个事务将合并为一个原子操作。即下一个事务将看到上一个事务的结果,就好象在一个事务中进行一样。

链事务与带有保存点的事务不同,带有保存点的事务能回滚到任意正确的保存点。而链事务中的回滚仅限于当前保存点。

嵌套事务

嵌套事务是一个层次结构框架。有一个顶层事务控制各个层次的事务。顶层事务之下嵌套的事务被称为子事务。

父事务回滚,子事务也会被回滚。即子事务具备,ACI的特性,不具备D的特性。

分布式事务

分布式事务是在分布式环境下运行的扁平事务。

对于InnoDB存储引擎,支持扁平事务,带有保存点的事务、链事务、分布式事务。但不支持嵌套事务。

1.3 事务的隔离级别

ANSI/ISO SQL标准(SQL92)定义了四种事务隔离级别(transaction isolation level)。这些事务隔离级别是针对三种现象定义的,在并发事务执行时,需要阻止这三种现象中的一种或多种发生。

三种需要阻止的现象(preventable phenomena)是:

脏读取(dirty read):简称“脏读”。指一个事务读取了被其他事务写入但还未提交的数据。

不可重复读取(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。

不存在读取(phantom read):简称“幻读”。事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。

辨析:不可重复读与幻读的区别

不可重复读与幻读,这种现象有些类似。

不可重复读的重点是修改:同样的条件, 读取过的数据, 再次读取出来发现值不一样。若需要避免该现象,只需要锁住满足条件的记录。

幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样。若需要避免该现象,要锁住满足条件及其相近的记录,或直接锁表。

SQL标准定义了4类隔离级别如下:

Read Uncommitted(未提交读)

所有事务都可以看到其他未提交事务的执行结果,即允许脏读。该隔离级别,很少实际应用。

Read Committed(已提交读)

一个事务只能看见已经提交事务所做的改变。即不允许脏读。但允许不可重复读,因为其他事务在当前事务的处理其间可能会有新的commit,所以前后的select可能返回不同结果。

Repeatable Read(可重复读)

确保一个事务在重复读取数据时,对重复读取到的数据行的值是不变的。避免了不可重复读。但无法避免幻读。即一个事务重复读取数据时,可能会发现有新的“幻影”行。

Serializable(可串行化)

串行的对事务进行处理。强制事务排序,使之不可能相互冲突,从而解决幻读问题。

只有当事务提交后,其他事务才能从数据库中查看数据的变化。

这是最高的隔离级别,在这个级别,可能导致大量的超时现象和锁竞争。

不同级别的隔离方法可以避免一定的现象:


\ 现象

隔离级别  \

脏读取 不可重复读取 幻读
未提交读  允许 允许 允许
已提交读  不允许 允许 允许
可重复读  不允许 不允许 允许
可串行化  不允许 不允许 不允许

2 MySQL的事务

2.1 MySQL的事务处理命令

在命令行交互环境下,或存储过程中,可以使用如下命令方便的操作事务。

初始化事务

命令:START TRANSACTION;

事务回滚

命令:ROLLBACK;

提交事务

命令:COMMIT;

设置保存点

命令:SAVEPOINT identifer

删除事务的保存点

命令:RELEASE SAVEPOINT identifer

回滚至保存点

命令:ROLLBACK TO [SAVEPOINT] identifer

自动提交

在MySQL中,若不更改其自动提交变量,则系统会自动向数据库提交结果。

关闭自动提交:SET AUTOCOMMIT = 0;

关闭自动提交之后,只有使用COMMIT命令后,才会提交事务。

查看AUTOCOMMIT值:

命令:select @@autocommit;

或命令:show variables like ‘autocommit‘;

2.2 事务的实现

事务的隔离性由数据库的锁来实现。原子性,一致性,持久性由数据库的redo log和undo log来完成。

  • redo log称为重做日志,用于保证事务的原子性和持久性。
  • undo log用来保证事务的一致性。

2.3 MySQL的隔离级别

MySQL的默认事务隔离级别为Repeatable Read(可重复读)

MySQL中InnoDB存储引擎结合了MVCC和Next-Key Lock锁的算法,避免了幻读的产生。InnoDB存储引擎在默认的Repeatable Read的事务隔离级别下,已经能完全保证事务的隔离性要求。即达到了Serializable隔离级别。

查看当前数据库使用的隔离级别。global.tx_isolation变量表示全局事务。tx_isolation表示当前会话的事务。

命令:select @@global.tx_isolation , @@tx_isolation;

修改当前数据库使用的隔离级别,使用SET语句对tx_isolation变量进行设置。用户需要有SUPER权限,才可以执行进行隔离级别的修改。

基本命令格式:SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。

若使用GLOBAL关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接。原有的连接不受影响。

若使用SESSION可以设置默认事务等级,用于对当前连接的事务。

例:将当前会话的事务隔离级别设置为Read Uncommitted(未提交读)。

命令:SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.4 分布式事务

InnoDB存储引擎支持XA事务,通过XA事务实现分布式事务。使用分布式事务时,InnoDB存储引擎的隔离级别必须设置为SERIALIZABLE。

XA事务允许不同数据库的分布式事务,只要参与在全局事务中的每个节点都支持XA事务。Oracle,SQL Server都支持XA事务。

XA事务由一个或多个资源管理器、一个事务管理器以及一个应用程序组成。

  • 资源管理器:提供访问事务资源的方法。通常一个数据库就是一个资源管理器。
  • 事务管理器:协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。
  • 应用程序:定义事务的边界。

2.5 事务与性能

很多应用其实是不需要事务的。例,在数据仓库中,若没有ETL这些操作,只是简单的报表查询是不需要事务的。

传统观点认为,事务隔离级别越高,数据越安全,但性能就越慢。事务隔离级别越低,性能就越快,但数据越不安全。

但在Jim Gray在《Transaction Processing》一书中指出,REPEATABLE READ 与SERIALIZABLE 的开销几乎是一样的。SERIALIZABLE 甚至可能更优。READ UNCOMMITTED的隔离级别也不会有太大的性能提升。

2.6 锁的简要介绍与使用

数据库锁也就是所谓的悲观锁。

2.6.1 锁的类型

读锁

又称共享锁、S锁。被锁定对象只允许被读,不允许被写。

若事务T对数据对象A加上读锁,则事务T可以读A但不能修改A,其他事务只能再对A加读锁,而不能加写锁,直到事务T释放A上的读锁。

写锁

又称排他锁、X锁。

若事务T对数据对象A加上写锁,事务T可以读A也可以修改A,其他事务不能读A,也不能再对A加任何锁,直到T释放A上的锁。

2.6.2 表级锁

操作对象是数据表,是系统开销最低但并发性最低的一个锁策略。

命令格式:LOCK TABLES 表1 锁类型, 表2 锁类型 ... ;

LOCK命令可以同时对多张表加锁。锁类型为READ、WRITE。

例:对student表添加读锁。

命令:lock tables student read;

例:对student表添加写锁。

命令:lock tables student write;

在用LOCK TABLES给表显式加表锁时,必须同时取得所有涉及到表的锁,并且MySQL不支持锁升级。也就是说,在执行LOCK TABLES后,只能访问显式加锁的这些表,不能访问未加锁的表;同时,如果加的是读锁,那么只能执行查询操作,而不能执行更新操作。其实,在自动加锁的情况下也基本如此,MyISAM总是一次获得SQL语句所需要的全部锁。这也正是MyISAM表不会出现死锁(Deadlock Free)的原因。

解锁

命令:UNLOCK TABLES;

UNLOCK命令会释放所有处于锁定状态的数据表。

2.6.3 行级锁

操作对象是数据表中的一行。行级锁对系统开销较大,处理高并发较好。

行级别的读锁

命令格式:SELECT ... LOCK IN SHARE MODE;

MySQL会对查询结果集中每行都添加共享锁。

行级别的写锁

命令格式:SELECT ... FOR UPDATE;

MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。

2.6.4 死锁

多个资源的并发经常会发生死锁现象。

表级锁是不会产生死锁的。MyISAM使用表级锁模拟事务是安全的。

InnoDB引擎拥有自动检查死锁的功能。当发现死锁现象,会自动解决死锁问题。

2.6.5 MySQL伪事务

由于MyISAM存储引擎可以支持表锁(不支持行级锁)。可以使用表级锁模拟事务。这种模拟的事务侧重点在于操作的隔离。这不是真正的事务,不具备回滚的操作。

表级锁是不会产生死锁,可以安全使用。

2.7 MVCC

MVCC,Multiversion Currency Control,即多版本并发控制。

一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。

在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段:

6字节的事务ID(DB_TRX_ID )

7字节的回滚指针(DB_ROLL_PTR)

隐藏的ID

使用这三个字段,利用类似于乐观锁的机制实现了近似的MVCC机制。具体原理参看相关参考资料。

关于MVCC的一些参考资料:

http://coolshell.cn/articles/6790.html

http://www.jayxu.com/2012/03/13/13326/

http://jishu.zol.com.cn/2960.html

http://blog.csdn.net/chen77716/article/details/6742128

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。

http://www.cnblogs.com/shijiaqi1066/p/3858050.html

MySQL事务概述

时间: 2024-10-09 03:28:11

MySQL事务概述的相关文章

MySQL优化概述

MySQL优化概述 设计: 存储引擎,字段类型,范式 功能: 索引,缓存,分区. 架构: 主从复制,读写分离,负载均衡. 合理SQL: 测试,经验. 存储引擎 Create table tableName () engine=myisam|innodb; 一种用来存储MySQL中对象(记录和索引)的一种特定的结构(文件结构) 存储引擎,处于MySQL服务器的最底层,直接存储数据.导致上层的操作,依赖于存储引擎的选择. Tip:存储引擎就是特定的数据存储格式(方案) Show engines 查看

MYSQL事务及存储引擎对比

Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性状态,这时有必要引入事务的概念. Mysql提供了多种引擎支持Innodb和BDB.Innodb存储引擎事务主要通过UNDO日志和REDO日志实现,Myisam和memory引擎则不支持事务.下图分别给出三种mysql引擎的区别和特性: Myisam存储引擎:由于该引擎不支持事务.也不支持外键,所以

MySQL事务和锁 (四)

一 .事务 1.1 事务的概念 mysql把多条写操作视为一个整体去执行,要么全部成功,要么全部失败,我们把mysql的这种处理叫做事务.(“多条”很好理解就是至少两条sql语句,“写操作”就是指对msyql内容修改的操作(insert.update.delete)). 1.2事务的特性 原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态. 一致性: 确保数据库正确地改变状态后,成功提交的事务. 隔离性: 使事务操作彼此独立的和透明的. 持久性

数据库-mysql事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL 事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL事务详解

事务:Transaction 多个sql语句,要么同时都执行,要么同时都不执行 事务就是一组原子性的(select)查询语句,也即将多个查询当作一个独立的工作单元 ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务 A:Atomicity,原子性,都执行或者都不执行 C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态 I:Isolaction,隔离性.一个事务的所有修改操作在提交前对其他事务是不可见的 D: Durability, 持久性,一旦事务得到提交,其

Mysql事务&字符集

Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: 2.Read committed 读已提交: 3.Repeatable read 可重复读,类似oracle利用undo的闪回查询: 4.Serializable 串行读,很少用. 隔离级别的修改: 通过set命令: 通过修改配置文件,启动数据库的默认隔离级别-mysqld Mysql字符集 My

十、mysql事务的简介

1. myisam跟memory支持表级别锁定 BDB 页级锁定 Innodb 行级锁定 2.表锁(不是表嫂哈) lock table read //只读表锁,也就是说执行了这个锁后,锁内的操作只能为读操作 select * from ..... unlock tables; lock table write //读写表锁,可读可写 insert ... update ... select ... delete ... unlock tables; PS::表被锁定后,其他连接的操作将被挂起,直

查询mysql事务隔离级别

查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 s