mySQL数据事物隔离级别简单分析

本文详细介绍了mySQL中事务的概念及作用,通过一个银行转账的例子解释了事务如何解决数据一致性问题,并深入讨论了四种隔离级别的实现及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      对于mySQL来说,事务是保证数据存储安全的一个机制。

      举个简单的例子,当一个用户到银行里转账,他需要两个步骤才能完成存钱的过程:第一步,将钱给客户经理,让客户经理将钱存入,第二部,钱被转到对方的账户上。

      这两步是两个独立的过程,现在可能出现这么一种情况,在完成第一步之后,银行的系统准备将你的钱汇到对方账户的时候,发现对方账户存钱问题,你的钱无法汇款过去。但是你的钱已经存入到银行中.....

      这个时候,问题就出现了,你给了银行钱,但是钱没有转账成功。

     

       事务就是为了处理这样的问题而被引入数据库。其将以上两个步骤捆绑到一起,一旦第二部没有完成,那么第一步也无法执行,这样,就妥善的解决了这个可能出现的异常情况。

       这只是一个最简单的情况,真正的事务,可以处理更加复杂的情况。


       在控制台的页面,你可以通过 start transaction 来开启一个事务。

       当你在输入以上的命令的时候,你之后执行的一系列的操作,在你没有commit之前,都不是有效的操作。也就是说你可以通过rollback命令,让这些操作全部无效。

     

        说到事务,就必须说事务的隔离级别。

        隔离级别就有点类似程序语言中的多线程同步问题。当两个事务同时对一个数据表进行操作的时候,就可能出现一系列的问题,比如A用户,修改了表中的数据,而B用户在读取的时候,就可能读取到修改后的数据,而其实他需要的是未被修改的数据。

        在多线程问题上,我们可以通过同步来保证安全性。

        但数据库则不同,为了让数据能够更快的被访问,我们尽量不能够将数据库中的表具有同步的特性,这样会造成数据的访问速度很慢。

         而且很多情况下,数据库都只是需要被读取数据,对于一个表,无需要加上锁,而让其他用户无法访问。隔离级别就是被用在处理这种情况。

         基于访问速度和安全性两个方面考虑,通常情况下,事务有四种隔离级别,读未提交(read uncommited)读已提交(read commited),可重复读(respeatable),可串行化(serializable).

         这四种隔离级别,按照上面所说的顺序,安全性依次增加。安全性增加带来的就是访问速度的降低。下面依次说一下这四种隔离级的性质。


1,读未提交

         在该隔离级别下,当A对表格进行修改,而并没有进行提交的时候,B在进行读取的时候,依然会读取到被A修改后的数据。


2,读已提交

         在该隔离级别下,当A对表格进行修改,在A没有提交之前,B在进行读取数据的时候,A的修改无效。但一旦A提交事务,那么B就会读取到A修改后的数据。


3,可重复读

         在该隔离级别下,当A对表格进行修改,在A提交之后,B在进行数据读取的时候,依然不会读取到A修改后的数据。但当A进行数据增加并提交之后,B就可能访问增加的数据。


4,串行化

         这个是安全性最高的级别,B在没有提交事务之前,A是无法对数据进行增加,删除等操作的。如果在B事务没有提交之前,A插入一条新的数据,那么该执行语句不会被执行,他需要等到B事务提交完毕之后,该插入操作才能够顺利完成。


     通常情况下,MYSQL的默认隔离级为可重复读。


     下面再说下隔离级别的一些比较常用的简单命令:

        start transaction;   开启事务

        commit;                  提交事务

       select @@tx_isolation;    查看当前的隔离级别

       set session transaction isolation level read uncommited;                  设置隔离级别为 读未提交

       set session transaction isolation level read commited;                     设置隔离级别为 读已提交

       set session transaction isolation level read  repeatable read;           设置隔离级别为可重复读; 

       set session transaction isolation level read serializable;                    设置隔离级别为 串行化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值