目录
1.什么是事务?
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务
1.2.冲突
--张三向李四账户转500元
update accout set money = money - 500 where name = '张三';
--李四账户多出500元
update accout set money = money + 500 where nmae = '李四';
假设在执行第一条SQL语句的时候公司断电了或者网络错误又或者是数据库此时正好挂掉了,张三的账户就少了500而李四的账户没有变化 ,这个时候就会影响非常大!!!
1.3.救星
这个时候 事务 就出来了!!!
事务最主要的一个原理就是 要么全部执行,要么全部不执行
2.事务的开启
--1)事务的开启
start transaction
--)SQL语句
--)回滚或者提交
rollback/commit(rollback 表示全部失败 commit 表示全部成功)
2.1.通过事务我们就可以解决上述转账的问题
start transaction; --开启事务
--张三向李四账户转500元
update accout set money = money - 500 where name = '张三';
--李四账户多出500元
update accout set money = money + 500 where nmae = '李四';
rollback; --全部失败
--完美解决
3.事务的四个基本特性
3.1原子性
最重要的一个特性, 要么全部执行,要么全部不执行
3.2.一致性
在事务执行之前和执行之后,数据库中的数据都得是合法的
例如,当你转完账后,不能出现账户是负数的情况!!!
3.3.持久性
事务一旦结束后,数据应该持久化存储起来,数据写入硬盘
3.4.隔离性
隔离性描述的事务并发执行时候产生的情况
4.事务的隔离性
4.1并发执行
什么叫并发执行,简单明了的语句就是说一心两用或者一心多用,对于人来说比较困难,但是对于计算机来说这是很正常的情况
然而,当并发执行多个事务的时候,尤其是事务在尝试修改或者读取同一份数据的时候,这个时候就很容易出现一些问题,而事务的隔离性就是用来解决这个问题
4.2脏读
事务A在对某个数据进行修改的同时,事务B去读取了这个数据,此时事务B读到的可能是一个“脏数据”(这个数据是一个临时的结果,而不是最终的结果)
那么如何解决这个问题呢?给事务加 锁 !!!
4.3.锁(简单介绍)
什么是锁呢,上述例子是说事务A在修改数据的时候事务B能读取这个数据,此时给事务A加个锁就代表着事务A在修改数据的时候事务B不能够去读取A
所以简单来说就是一个事务正在执行的时候其他事务不能干涉!!
面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁__陈哈哈的博客-CSDN博客
4.4.不可重复读
然而简简单单的给事务A加一个锁就可以了吗,例如当事务A完成某个数据的修改后,事务B可以查看A的数据了,但此时事务A又因为紧急事故又开始进行对数据的修改,而此时B还在查看A第一次修改的数据,当A修改完之后,B发现同一个数据和自己读的不一样了,此时便发生了所谓的 不可重复读
以上约定是说事务A在修改数据的时候事务B不能查看,并没有说读的过程不能写
如何解决????
答案:再加个锁
在读的时候加个锁,意味着当你读取这个数据的时候你不能去修改这个数据
4.5.幻读
当我们沉静在解决了不可重复读的喜悦当中,此时又发生了一件事,上述解决不可重复读的方法是给写和读加锁,只是对于单一的数据来说的,并没有说不能去修改其他的数据
例如,当事务B在查看事务A修改的数据时,此时事务A去修改了另一个数据
就如上述图所示的情况,当事务B读完数据之后发现原本的一条数据变成两条数据了 ,这就是所谓的 幻读 问题!!!
4.6.串行化
为了避免幻读,我们引入了串行化,什么是串行化,简单来说,就是当进行写或者读的时候,不能做任何事情
例如,事务A在进行修改或者读取数据的时候,其他的事务什么事也不能干,事务B读取事务A的数据的时候,事务A以及其他事务什么事也不能做!!!
5.总结以及MySQL隔离级别
MySQL的隔离性非常值得我们重视
并发(快)和隔离(准)是不能兼得的,我么可以根据实际需要来调整数据可以的隔离级别,通过不同的隔离级别你也就控制了事务之间的隔离性,也就控制了并发过程!!!
read uncommitted
--允许读取未提交的数据,并发程度最高,隔离程度最低,会引入脏读+不可重复度+幻读
read committed
--只允许读取提交之后的数据,相当于写加锁,并发程度降低,隔离程度提高了一些,解决了脏读,会引入不可重复度+幻读
repeatable read
--相当于个读和写加锁,并发程度又降低了,隔离程度有提高了,解决了脏读和不可重复读,会引入幻读
serializable
--串行化,并发程度最低,隔离程度最高,解决了脏读 不可重复读 幻读问题,但是执行效率最低
--以上可以通过修改 my.ini这个配置文件,来设置隔离级别