一.事务是什么,怎样来理解事务呢?
下面我们来举个栗子让大家清晰的理解一下事务:
先准备一个测试表:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar(20) comment '账户名称',
money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('阿里巴巴', 5000),
('四十大盗', 1000);
如果说四十大盗从阿里巴巴偷盗了2000元;
阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
那么这个时候问题就来了:
假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上就没有增加2000,这种情况怎么解决呢?
这时候那就可以用事务来解决:
使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
二.事务的概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
三.事务的四个特性
1.原子性
:一个事务是一个不可分割的工作单位,其中包含的操作,要么就全都正确执行,要么就一个都不做.如果执行过程中,第一步成功了,第二部出现问题了,为了避免数据错误,往往都会进行回滚(rollback)
2.一致性:
事务执行后,数据要处在一种合法的情况
隐含条件:
1)转账之前和之后,都得表彰前者和后者金额加起来不变.
2)金额不能为负的.
3.持久性
事务一旦被提交(执行完毕),对于数据库的修改就应该是永久的,接下来的其他操作/故障,都不会影响事务的正确性.
当食物已执行成功后,事务二无论出现什么极端情况,都不会对事务一造成影响.
4.隔离性
多个事务并发执行的时候,事务的内部操作和其他事务的内部操作是相互隔离的(没有影响)
四. 并发的概念::
从微观上看,CPU上的程序都是串行执行的,但是由于切换速度极快,从宏观上看,感觉多个程序好像是同时执行的,这就是并发.
并发能提高程序的执行效率,如果在不影响数据正确性的情况下,我们还是希望能够尽可能的让多个事务并发执行.
五.并发操作数据库可能带来的问题:
1.脏读:
在并发执行两个事务的时候,读取到的数据或者代码块不是最终的数据或者代码块,读到了错误的信息,因为我们没有对隔离性做出任何要求,于是就产生了脏读.
为了避免脏读,在写操作的时候"加锁" (这就提高了隔离性,也降低了并发性)
2.不可重复读:
一个事务内读取两次数据的结果不一致
刚才对写操作加锁之后,虽然能够解决脏读问题,但是不可重复读仍然存在.为了避免不可重复读,可以再"读操作"也加锁.(隔离性进一步提高,并发性进一步降低了);
3.幻读:
同一个事务内多次查询返回的结果集不一样.读取到的数据比原来的数据多了一个或者少了文件.
为了解决幻读问题海的进一步提高隔离性’串行化’
六.Mysql中事务的隔离级别:
1.read uncommitted 允许读取未提交的数据,并行最大,隔离最低,会产生脏读问题.
2.read committed 只允许提取提交的数据,相当于写加锁,并行降低了一点,隔离提高了一点,能够避免脏读问题,但是存在不可重复读.
3.repeatable read 读写的时候都加锁,此时并行进一步降低,能够避免不可重复问题,存在幻读问题,(默认隔离级别)
4.serializable 严格串行执行,隔离程度最高,并行程度最低,能够避免幻读问题.