设为首页 收藏本站
查看: 441|回复: 0

[经验分享] mysql的事务和隔离级别详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-11-24 09:41:11 | 显示全部楼层 |阅读模式
Mysql中的事务
事务是DBMS中的执行单位,它是有限的数据库操作序列组成的。但是并不是所有的数据库操作序列都能成为事务。一般说来,事务具有如下4个特性(ACID特性):
1、原子性(Automicity):该特性引起的数据库操作"要么全部执行,要么全部不执行"。
2、一致性(Consistency):该特性表示数据库操作之前和操作之后的最终状态是一致的。比如,两个用户a,b之间相互转账,但是最终两个用户的总金额是不变的。
3、隔离性(Isolation):多个事务并发执行时,各个事务独立执行,且各个事务之间的影响最小。
4、持久性(Durability):一旦事务提交执行成功,则系统保证在任何故障下,事务都不会引起不一致性。


mysql中的脏读、不可重复读和幻读的概念
脏读:在Read-Uncommitted隔离级别下的当前事务中可以读到其他事务还没有提交的数据 。            
不可重复读(non-repeatable reads):在当前事务中,且未提交,且其他事务在修改相关数据时,两次查询的结果不一样,就叫做不可重复读。
幻读:就是当前同一个事务在未提交和提交后的结果不一样。感觉像幻像一样。


mysql中隔离级别分为4种:
1、Read-Uncommited:读未提交。该隔离级别下的当前事务可以看到其他未提交事务的执行结果。在该级别下会出现脏读现象。
2、Read-Committed:读提交。解决了脏读的问题。在该隔离级别下,当前事务只能看到其他事务提交后的执行结果。因此该隔离级别支持不可重复读。大多数数据库的的默认隔离级别为Read-Committed,但是mysql不是的。
3、Repeatable-Read:重复读。解决了不可重复读的问题。在该级别且当前事务没有提交的前提下,不管其他事务如何修改数据,每次查询的结果都是一样的。一旦当前事务提交,则查询的结果就是最新的结果。因此会出现幻读的现象。事务提交前和提交后的结果不一样。在该级别下,为了提高并发能力,需要借助MVCC(多版本并发控制)机制来完成。这是mysql的默认隔离级别。
4、Serializable:可串行化。就是事务接着一个一个的串行执行,只有同一个实例下的其他事务结束后,才可以执行同一个实例下的另一个事务。这样就解决了幻读的问题。

总结:mysql的四种默认隔离级别所出现的读取方式:
1、Read-Uncommitted:会出现脏读、不可重复读等现象。
2、Read-Committed:会出现不可重复现象。
3、Repeatable-Read:会出现幻读现象。
4、Serializable:不会出现脏读、不可重复读、幻读等现象。

由此可见,隔离级别越高,所受到的干扰越小,消耗系统的资源越多。且最重要的是它们的并发性能越差。

mysql处理事务有2种方法:
1、手动执行事务
        mysql>begin; 或mysql>start  transaction;   ##表示启动事务
        mysql>rollback;                           ##撤销之前所做的修改(回滚)
        mysql>commit;                              ##提交事务

2、设置事务的自动提交模式
        mysql>select @@autocommit;   
        ##查看当前事务是否是自动提交的。0或off表示关闭自动提交;1或on表示开启自动提交
        set  autocommit=0    ##关闭自动提交功能(只能用于当前会话,这是修改的会话变量)
        set  autocommit=1    ##开启自动提交功能(只能用于当前会话,这是修改的会话变量)
建议:明确使用事务,关闭自动提交功能。

mysql中隔离级别的设定:
mysql>select @@tx_isolation;        ##显示当前的隔离级别
mysql>set  tx_isolation='VALUE'   ##用来设定隔离级别


事务的执行状态:共有5种状态
1、active:表示当前事务正在进行当中
2、部分提交的:表示语句在执行过程中,由于某种原因(如宕机)导致只执行了一部分。因此事务就处于该状态下。
3、失败:表示事务没有执行成功。
4、终止:由于事务执行失败,因此系统会终止该事务
5、提交成功:表示提交后,事务执行成功。


mysql的锁机制:
mysql支持表锁、页锁和行锁。其中行锁由存储引擎来完成
表锁又分为读锁和写锁:
        读锁:也叫共享锁。当前事务进程和其他事务进程只能进行读操作,不能进行写操作。申请读锁成功的前提是当前事务进程没有对该表使用写锁。否则会被阻塞。

         写锁:也叫独占锁。只有当前事务进程具有写操作,其他事务进程既不能读,也不能写。

         锁机制一般是系统自动完成的,当然也可以手动为表加锁和解锁:

                 加锁命令:LOCK  TABLES tb_name {READ|WRIITE};

                 解锁命令:UNLOCK TABLES;

行级锁:行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,由于其粒度小,加锁的开销最大。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-33529-1-1.html 上篇帖子: 使用Google的Tcmalloc加速MySQL 下篇帖子: MySQL5.5编译安装和安装后的基本配置 mysql 隔离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表