MySQL事务的的介绍及使用
- 事务的特性
1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。
3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
写这些概念呢,是有点绕!绕就绕吧!反正也不是我规定的,这是官方的,解释是我编的!!!
- 事务的并发访问问题
如果我们在不考虑隔离性问题时,事务是存在三种并发访问问题的。
1.脏读:在一个事务中,当读取数据时,读到了另一个事务未提交的数据。
比如A账户给B账户转了1块钱,但是A没有提交事务,被B账户通过脏读看到了,这时,B就会以为A已经把钱转过来了,但是这时,A账户回滚事务。其实钱就没给B转过去,但是B自己本身以为A已经转过去了,,,有点绕,估计是我描述到绕!
看代码:
1
2
3
|
update account set money=money+1 where name =’B’; --此时A去通知B update account set money=money -1 where name =’A’; |
2.不可重复读:在一个事务中,两次读取的数据内容不一致,这是因为在查询时,有时间间隔,数据被另一个事务已经修改提交了,那就会出现问题。
3.幻读/虚读:在一个事务中,两次读取的数据量不一致。
- 事务的隔离级别
上面介绍了3种事务并发问题!现在介绍一下数据库提供的解决方案!
1.read uncommitted : 读取尚未提交的数据 :这个最低级,但是效率肯定最高,但是哪一个问题都不能解决。
2.read committed:读取已经提交的数据 :可以解决脏读 。
3.repeatable read:重读读取:可以解决脏读 和 不可重复读 。
4.serializable:串行化:可以解决脏读不可重复读和虚读,效率最差,相当于锁表,开发中一般不用。
上面的“2”是oracle数据库默认设置,“3”是mysql数据库默认的设置。
下面呢我就重点解释一下mysql数据库在上面各种事务隔离级别上的演示:
首先介绍两个语法:
1.查看mysql数据库默认的隔离级别:select @@tx_isolation
如图:
2.设置mysql的隔离级别:set session transaction isolation level 事务的隔离级别
如图:
- 事务的隔离级别演示
注意:如果要自己模拟要开启两个mysql客户端,也就是模拟两个用户!
1.read uncommitted
如图:
我通过语法将数据库的事务隔离级别改为了read uncommitted。
首先我有一张account表。
如图:窗口一
窗口二
数据库表原始数据money都是5000,当我启动事务后,在zhangsan账户增加了1000和在李四账户减去了1000,但是我的事务还未提交,但是我再次查询数据库表时,数据已经发生变化,这就是脏读和不可重复读!
幻读/虚读我就不掩饰了,同样存在!
2.read committed
如图:
我将数据库事务隔离性改为了read committted。
还是上面那张表:
如图:窗口一
窗口二
数据库表zhangsan账户的money和lisi账户的money都发生了变化,我未提交事务,在另一个窗口事务开启下查询时,没有出现脏读,但是当我提交事务时,在另一个窗口的事务下再次查询,出现了不可重复读的情况,这样可以避免脏读,但是查询时已经出现不可重复读和幻读/虚读!
3.repeatable read
如图:
我将数据库事务隔离性改为了read committted。
还是上面那张表:
如图:窗口一
窗口二
我在两个窗口都开启了事务,当窗口一进行数据操作后,并进行事务提交,在窗口二的事务开启情况下,我去查询,没有查询到刚才窗口一的数据操作记录,这样就避免了脏读和不可重复读。
有人说也避免了虚读/幻读,其实没有。
看图:
我在操作lisi账户时,数据只是发生修改的变化,但是当我修改wangwu这个账户时,再去查询出现了wangwu,账户的数据,但是其实在我未操作前,wangwu账户的数据是查询不出的。这就是幻读/虚读!
如果不理解幻读/虚读这块,可以查一下InnoDB。
4.serializable
我就不演示了,开发不建议用,效率又慢,但是所有的问题都能避免!!
总结一下
事务隔离级别的性能:
read uncommitted>read committed>repeatable read>serialazable
事务隔离级别的安全性:
read uncommitted<read committed<repeatable read<serialazable
mysql 事务控制:
开启事务:start transaction;
提交:commit;
回滚:rollback;
MySQL事务的的介绍及使用的更多相关文章
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- 数据库事务隔离级ORACLE数据库事务隔离级别介绍
本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...
- MySQL事务内幕与ACID
MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID ...
- MySql 事务与锁
事务介绍 首先,什么是事务?事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子),不可分割,要么都执行,要么回滚(rollback)都不执行. MySQL 事务主要用于处理操作量大, ...
- MYSQL事务及存储引擎对比
Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性 ...
- MySQL事务与锁
MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...
- mysql事务隔离级别详解和实战
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
- 深入学习MySQL事务:ACID特性的实现原理
事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...
- 一文说尽MySQL事务及ACID特性的实现原理
MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...
随机推荐
- 【一天一道LeetCode】#78. Subsets
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Web报表工具FineReport二次开发JS之字符串
在报表开发过程中,有些需求可能无法通过现有的功能来实现,需要开发人员二次开发,以FineReport为例,可以使用网页脚本.API接口等进行深入的开发与控制. 考虑到JS脚本开发的使用较多,这里先先简 ...
- 4.4、Libgdx使用方法查询运行环境相关属性
(原文:http://www.libgdx.cn/topic/46/4-4-libgdx%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E6%9F%A5%E8%AF%A2%E ...
- 网站开发进阶(二十九)HTML特殊转义字符
HTML特殊转义字符 参考文献 http://tool.oschina.net/commons?type=2 美文美图
- Oracle中添加自动编号的序列
1. 创建表T_Test create table T_Test(id int ,address char(25), pay int); 2. 创建自增序列 create sequence SEQ_ ...
- libevent之Reactor模式
通过前边的一篇博文轻量级网络库libevent初探,我们知道libevent实际上是封装了不同操作系统下的/dev/poll.kqueue.event ports.select.poll和epoll事 ...
- 在 ServiceModel 客户端配置部分中,找不到引用协定“XX”的默认终结点元素的解决方法
今天在CRM2011中写Plugin的的时调用WCF报错,错误如下:"在 ServiceModel 客户端配置部分中,找不到引用协定"XX"的默认终结点元素.这可能是因为 ...
- NumberProgressBar开源项目学习
1.概述 多看多学涨姿势, github真是个宝库 这个项目主要是实现数字进度条效果 github地址在https://github.com/daimajia/NumberProgressBar 感谢 ...
- 数据库用户映射到SQL Server登录名
由于不是固定在一如电脑开始,经常需要把数据备份与恢复.或者是帮助客户修改程序,接收到客户备份好的数据,需要在电脑恢复. 这样就需要将数据库用户映射到 SQL Server 登录名.如何映射?可使用下面 ...
- Git与远程reposiory的相关命令
问题1:Git如何同步远程repository的分支(branch) 某天,小C同学问我,为啥VV.git仓库里面本来已经删除了branchA这个分支,但是我的mirror中还是有这个分支呢? 分析: ...