MySQL事务管理
事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组的全部语句,如果其中有任何一条语句因为崩溃或者其他原因无法执行,那么所有的语句都不会执行。(事务内部中的语句要么全执行,要么全不执行)
除非系统通过严格的ACID测试,否则空谈事务的概念是不够的。
- 原子性(Atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
- 一致性(Consistency) 数据库总是从一个一致性的状态转换到另一个一致性的状态
- 隔离性(Isolation) 一个事务所做的修改在最终提交以前,对其他事务是不可见的。
- 持久性(Durability) 一旦事务提交,则其所做的修改就会永久保存到数据库中。
就像锁粒度的升级会增加系统开销一样,这种事务处理过程中额外的安全性,也会需要数据库做更多的额外工作。通常需要更强的CPU处理能力,更大的内存和更多的磁盘空间。用户需要根据不同的业务来选择是否需要事物处理,选择何种存储引擎。对于一些不需要事务的查询类应用,选择一种非事务型存储引擎可以获得更高的性能。即使是存储引擎不支持事务,也可以通过LOCK TABLES提供一定程度的保护。
隔离级别
- READ UNCOMMITITED 未提交读 事务中的修改,即使没有提交,对其他事务都是可见的。事务可以读取没有提交的数据(脏读,Dirty Read)
- READ COMMITTED 提交读 大多数数据库系统的默认隔离级别都是READ COMMITTED(MySQL不是)。一个事务开始时,只能看见已经提交的事务所做的修改。这个级别有时候也叫做不可重复读(nonrepeatable read),因为在同一事务中的两次执行同样的查询,可能会得到不一样的结果。
- REPEATABLE READ 可重复读 保证了在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读(Phantom Read)。幻读指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围插入了细腻的记录,当之前的事务再次读取该范围的记录,会产生幻行(Phantom Row)。可重复读是MySQL的默认事务隔离级别
- SERIALIZABLE 可串行化 通过强制事务串行执行,避免了前面说的幻读的问题。SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发情况下,才考虑采用该级别。
死锁
为了解决死锁问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,比如InnoDB存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。
InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。锁的行为和顺序是和存储引擎相关的。以同样的顺序执行语句,有些存储引擎会产生死锁,有些则不会。
事务日志
事务日志可以帮助提高事务效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。
事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。目前来说,大多数存储引擎都是这样实现的,我们通常称之为预写式日志(Write-Ahead Logging),修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身没有写回到磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这一部分修改的数据。
MySQL提供两种事务型的存储引擎:InnoDB和NDB Cluster。另外还有第三方存储引擎也支持事务,比较知名的包括XtraDB和PBXT。
自动提交(AUTOCOMMIT)
MySQL默认采用自动提交(AUTOCOMMIT)模式,也就是说,如果不是显式地开始一个事务,则每个查询都被当作一个事务执行提交操作。当我们禁用AUTOCOMMIT时,所有的查询都是在一个事务中,直到显式地执行COMMIT或者ROLLBACK,让事务结束。
修改AUTOCOMMIT对非事务类型的表,譬如MyISAM或者内存表,不会有任何影响。
还有一些命令在执行之前会强制执行COMMIT提交当前活动的事务(譬如DDL)
MySQL可以通过执行SET TRANSACTION ISOLATION LEVEL 命令来设置隔离级别。新的隔离级别会在下一个事务开始的时候生效。
在事务中混合使用存储引擎
MySQL服务器层不管理事务,事务是由存储引擎实现的。所以在同一个事务中使用多种存储引擎是不可靠的。
如果在事务中混合使用了事务型的表和非事务型的表,在正常提交的情况下不会有什么问题,但是如果该事务需要回滚,非事务型的表上的变更就无法撤销,这会导致数据库处于不一致的状态,故而难以修复。
隐式和显式锁定
InnoDB采用的是两段锁协议,在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT或者ROLLBACK的时候才会被释放,并且所有的锁是在同一时刻被释放。(隐式锁定)
InnoDB也支持通过特定的语句进行显式锁定(不属于SQL语句规范)
SELECT ... LOCK IN SHARE MODESELECT ... FOR UPDATE
MySQL也支持这两种语句,这是在服务器层实现的,和存储引擎无关。但不能代替事务。 如果应用将表从MyISAM转换到InnoDB,但是还是显式地使用LOCK TABLES语句,不但没有必要,还会严重影响性能。
MySQL事务管理的更多相关文章
- 测试MySQL事务管理
1.MySQL 版本 mysql> select version(); +------------+ | version() | +------------+ -log | +--------- ...
- 10.mysql事务管理及python操作
在用户操作MySQL过程中,对于一般简单的业务逻辑或中小型程序而言,无需考虑应用MySQL事务.但在比较复杂的情况下,往往用户在执行某些数据操作过程中,需要通过一组SQL语句执行多项并行业务逻辑或程序 ...
- mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚
mysql的引擎常用的有两个,一个MyISAM,另一个是InnoDB,mysql默认的为MyISAM,而InnoDB才是支持事务的.所以一般需要修改下,如何修改就不说了. 事务需要依赖数据库,好久没使 ...
- Spring+Mybatis+MySql+Maven 简单的事务管理案例
利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...
- mysql 事务是专门用来管理insert,update,delete语句的,和select语句一点不相干
1.mysql 事务是专门用来管理insert,update,delete语句的,和select语句一点不相干 2.一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性).Con ...
- MySQL存储过程之事务管理
原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...
- mysql之事务管理
本文内容: 什么是事务管理 事务管理操作 回滚点 默认的事务管理 首发日期:2018-04-18 什么是事务管理: 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不 ...
- MySQL:管理MySQL、事务(三)
干货: 命令行程序mysql实际上是MySQL客户端,真正的MySQL服务器程序是mysqld,在后台运行. 数据库事务具有ACID特性,用来保证多条SQL的全部执行. 五.MySQL 通过mysql ...
- MySQL事务及Spring事务管理
事务,是在数据库中用于保证数据正确性的一种机制,涉及到很多概念以及不同的情况,这里做一个总结 相关概念 事务四特性(ACID) 原子性(Atomicity,或称不可分割性):要么全部完成或者全部不完成 ...
随机推荐
- 图解http 笔记
一,了解web以及网络基础 1,使用http协议访问web web页面是由web浏览器根据地址栏中指定的url从web服务器获取文件资源等信息然后显示的页面. 像这种通过发送请求获取服务器资源的web ...
- Scala 中使用 akka system 的 scheduler 的例子
这是在scala控制台直接执行的例子. import akka.actor._ import scala.concurrent.duration._ import scala.concurrent ...
- 贪心--cf、education62-C
cf-Education 62-C 题目 C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes i ...
- php-redis 模块 文档
直接从这位朋友转载过来. 地址 Redis::__construct构造函数$redis = new Redis(); connect, open 链接redis服务参数host: string,服务 ...
- LINUX 查找替换命令 总结
find /var/ -name "*.php" > /home/tmp 在/var/目录下查找 所有以.php后缀结尾的文件 结果很多,就 > 输出结果到/home ...
- 群晖MyDS账号注册--实现使用QuickConnect外网访问
最近公司拿了个NAS给我,让我把它配置好,之前没有接触过这个东西,上网一查,发现就是和去年很火的玩客云和斐讯天天链N1的功能一样,可以实现文件储存和文件共享. 设备型号:群晖DS214SE 系统版本: ...
- js empty() vs remove()
转自:jQuery empty() vs remove() empty() will remove all the contents of the selection. remove() will r ...
- 图像RGB2YUV与YUV2RGB格式互转介绍
1 YUV格式与RGB格式说明 由于不同国家的电视信号系统支持的图像格式不同,有YUV格式成像,也有RGB格式成像,因此为了保证兼容性,需要进行RGB与YUV格式的互转. 另外YUV格式具有亮度信息和 ...
- 把AspDotNetCoreMvc程序运行在Docker上-part2:修改容器以及发布镜像
在上一个part<把AspDotNetCoreMvc程序运行在Docker上-part1>,已经将成功将aspdotnetcore程序运行在两个不同的容器中,目前两个容器的内容完全相同,只 ...
- IOS折线图二
上周把项目的折线图给做了下,今天想着把它完善完善,自己设置了不同的数据源来测试,哈哈,还真遇到问题了, 就是给图表设置折点数为0时,视图显示的还是原来的,由于数据为空,应该将其设置为空,所以想着怎么把 ...