一、事务是什么?
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
例如实用场景:微信转账
事务就是
二、事务的实现和性质
1.事务的实现
代码如下(示例):
我们先创建一个mysql数据表
//比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元 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 update accout set money=money-2000 where name = '阿里巴巴'; -- 四十大盗账户增加2000 update accout set money=money+2000 where name = '四十大盗';
假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是
四十大盗的账户上就没有了增加的金额。
解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;-
-全部成功
2.事务的四大性质
1.原子性:
因为分子是有院子构成,原子是物质中最小的单位了,不能被细分.同理所以原子性所要表达的是在事务中执行的一组代码要么全部执行成功要么全部不要执行.
2.一致性:
在我们执行代码成功后数据库数据要和数据库之前数据要合理合法保持一致(并不是相同).
例如:你给别人转账成功后你的支付宝或者微信余额不能是负数.
3.持久性:
事务一旦被成功执行后,数据就会长久的存储,存入到磁盘中.
4.隔离性(重要):
隔离性所表现的是在执行事务中我们要根据我们所要达到的需求来编写代码,根据此代码来实现隔离性的大小作用.在我们实现事务中我们会遇到一些问题,接下来我将把事务中的需求介绍给大家,并且来说明此方法的利弊.
其实我们在实现事务的时候我们一般会将并发性和隔离性放在一起来讨论的.
所谓的并发性就是类似于在我们一起在线填写文件,例如大学里学生一起填写班级表.
问题1:"脏读"
在我们填写事务数据的时候事务会将他所得到临时写下的数据默认为最终数据,当我们事务修改之前填写的数据后,事务得到的数据和我们最终写下的数据是不一样的,这就造成了"脏读".
解决方法:
就是将在编写数据的时候上一把🔒,这样事务1在写数据的时候,事务2是不能够读取事务1的数据的.等到事务写完数据后事务2才可以读到事务1的数据.
隔离性增强,并发性降低
问题二:"不可重复读功能"
解决方法:
在我们解决后"脏读"问题后,我们发现在我们读代码的时候会同时发生在修改代码,所以我们在读代码后我们也是需要将读代码时上🔒.
隔离性增强,并发性降低
问题三:"幻读"
在我们读代码的时候虽然上了🔒,但是肯会发生假如你在读取A代码时会发生同时在编写B代码.
解决方案:
我们会根据代码来实现串行化.
隔离性增强,并发性降低
总结:
根据上面所描述的我们会发现 隔离性和并发性是二者不能兼得.
MySQL事务处理的几个级别: