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,或称不可分割性):要么全部完成或者全部不完成 ...
随机推荐
- 有道词典命令行查询工具(Mac/Ubuntu)
说明:此工具是基于node.js的,所以必须安装npm. 官网:https://github.com/kenshinji/yddict 安装: Mac: # 安装npm brew install np ...
- Html5与本地App资料整理分析
最近开发了一个小的手机网站,重新了解了本地应用,html5,混合应用,webApp等概念,整理下相关的资料,略带自己的思考 用户固有的使用习惯 在<2012年度 HTML5状况及发展形势报告.p ...
- Linux启动与关闭WIndows服务记录
启动: mono-service -l:/var/run/Myservice-lock.pid MyService.exe (这个-l参数一定要加上) 控制服务: 暂停: kill -USR1 `ca ...
- 修改docker的port端口映射
原以为修改docker的端口映射只是一条命令就可以搞定,结果发现没那么简单,记录一下以防忘记.1. 查看需要修改的容器,记住container iddocker ps -a2. 停止容器docker ...
- hibernate_boolean类型的处理
xml方式,直接写就行,hibernate会直接帮你生成: javaBean代码片段: private boolean leaf; public boolean isLeaf() { return l ...
- Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
不多说,直接上干货! 写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentO ...
- javac的Resolve类解读
方法1:isInitializer() /** An environment is an "initializer" if it is a constructor or * an ...
- nginx安装及其配置详细教程
1 nginx 介绍 1 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 由俄罗斯的程序设计师Igor Sysoev所开发,官方 ...
- JavaScript数据结构-17.图结构
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于delete和对象复制
本码农的惯例,开篇废话几句... 前天小生又被虐了... 没办法,作为一个资深code user,我用代码的能力,解决问题的能力自问是不弱的... 但是自身的前端基础说实话还是不过硬,最明显的表现就是 ...