MySql 事务及其隔离级别
事务的概念:
事务通俗解释:由一系列操作组成,最后完成一件事 例如:转账 转账从A账户转到B账号,需要先将A账户中的金额减少,再将B账户的金额增加。 那么转账就是一个事务,A金额减少,B金额增加为完成这项事务的各个操作。 并且各个操作要么全部成功,要么全部失败。
事务具有四个特性:
- 持续性:指一个事物一旦提交,它对数据库中数据的改变就应该是永久性的。
- 原子性:说事物不可拆分,就等同于刚才说的,操作要么全部成功,要么全部失败
- 隔离性:各个事务之间不可互相干扰
- 一致性:执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
事务并发执行带来的问题以及解决方法(本文重点)
事务并发通俗的说就是两件事同时执行:是为了效率。 ”隔离性“就是为了降低事务并发带来的干扰:是为了准确性。
并发带来的问题
1.脏读问题
比如程序员A在写代码的过程中,被程序员B看到了,但是B看了几眼就走了。在B走了 后A又对代码进行了修改,那么B刚才读的数据就是“脏数据”。
转移到事务来说就是,A事务执行过程中,B事务又来读取了一遍数据,但是随后数据就被A事务修改了,那么B读取的数据就是不准确的,这就是脏读 解决办法:给读操作加锁,保证事务执行完毕之前,其他事务无法读取数据
2.不可重复读
比如程序猿A提交完数据后,程序猿B开始读,读到一半程序员A又把数据改了,然后B读着读着发现数据跟刚刚看的不一样了
这就导致了两次读取操作结果不一致。 解决方法:就是在解决脏读问题的方法:给读加锁。上,再加一条限制,数据在被读取时不可更改。
3.幻读
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据 时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
幻读是不可重复读的特殊情况,不可重复读主要是说数据内容改变了,幻读是数据个数改变了 解决方法:保证读和写必须在一个事务执行完,才可执行另一个事务
MySql提供解决以上问题的几种隔离级别
为了兼顾效率和准确性,MySql等数据库提供了几种隔离级别(根据使用情况选择是更偏向效率还是更偏向准确性)
- read uncommitted ???并发能力最强,隔离性最弱
- read committed????? 解决了脏读问题,只能读取提交后的数据
- repeatable read ?????解决了不可重复读问题,对读和写都进行了限制
- serializable??????????解决了幻读问题,并发能力最弱,隔离性最强
可在my.ini配置文件中修改,默认为repeatable read
|