商道如狼道 发表于 2024-12-4 13:45:48

【MySQL】深度学习数据库开发技能:mysql事件穿透式解析

        前言:本节内容开始讲解事件。 博主操持用三节来讲解事件。 本篇为第一节, 重要解释什么是事件, 事件有什么用。 以及事物的基本操作和非常退出回滚情况。 下面不多说,友友们, 开始学习吧!
        ps:本节内容建议友友们学会表的操作后再来学习哦, 会学的轻松很多!
目次
什么是事件
CURD满足什么性质, 才能办理上面的问题呢?
MySQL事件维护的四大属性
为什么会出现事件
实际操作预备工作
事件正式操作
rollback to
rollback
commit长期化
事件非常
自动提交和不自动提交

什么是事件

        我们现实大部门都是一组sql,才能将一系列操作给做出来。在我们步调员的眼中,一条sql就是一条操作。但是对于上层用户来说,每每几条sql来完成某个逻辑,就比如买票。 而这几条sql,我们就称为事件。以是,事件的本质要站在mysql的上层来看,就是一条大概多条sql组合起来完成某种逻辑的聚团体。
        并且,对于数据库的CURD来说,我们的买票场景, 可能就有时间只剩下一张票, 这时间来了一个人买票, 但是还没有更新数据。此时又来了一个客户端, 发现票数大于0, 就又买了一次票。 但是当两个客户端都更新数据的时间, 发现票数变为了-1。 这个时间就发生错误了, 相当于多卖了一张票。 以是, 事件就出现了。
CURD满足什么性质, 才能办理上面的问题呢?

   

[*]        买票的过程是原子的;
[*]        买票的过程不应该相互影响;        
[*]        买完票应该是永世的;
[*]        买完票后的状态应该是确定的;        
MySQL事件维护的四大属性

   

[*]        原子性:要么完成, 要么不完成。
[*]        一致性:一致性就是一个事件开始和开始之后, 我们用户数据的完备性没有被破坏。在mysql中, 对于一致性没有更多的操作。他只要做好原子性、隔离性、长期性、就能在技能层面上完成一致性。
[*]        隔离性:数据库允许多个事件同时对数据举行修改和读写。隔离性可以将一个一个的事件隔脱离, 就能让事件之间不会彼此影响。事物的隔离性存在不同的分级。
[*]        长期性:事件处置惩罚完之后, 对于数据的修改就是永世的。纵然是体系故障也不会丢失。
       这四大属性被称为ACID     
为什么会出现事件

        事件是被mysql编辑着设计出来的。的按时事件不是自然就有的, 而是当mysql被写出来之后, 发现需要这个东西。另外, 他是为了让我们的C/C++大概java, python这种用起来更加方便, 简化编程模型, 要么提交, 要么回滚。 我们不去考虑宕机, 网络非常各种情况。 以是, 事物本身就是为了应用层服务的。
实际操作预备工作

        在mysql中, InnoDB支持事件, 但是MyISAM是不支持事物的。https://i-blog.csdnimg.cn/direct/22342f7aa028454f8f8cbbde2b97f671.png
        事件有两种提交方式:一种叫手动提交, 一种叫自动提交。
        将来我们有事件,我们得自己提交。 mysql中事件的提交方式有两种:默认提交,手动提交。 如何查看当前事件的提交方式?
        使用指令:
show variables like 'autocommit'; https://i-blog.csdnimg.cn/direct/6cbc0a94157a403cb56630611bb8ba9a.png

        然后我们举行测试的时间, 我们的隔离级别, 先设置成读未提交。 背面我们在来讲解这些不同的隔离级别:
set global transaction isolation level read uncommitted; https://i-blog.csdnimg.cn/direct/1e3c028f752d448f8166519086f97703.png         然后查看当前的隔离级别:
select @@transaction_isolation; https://i-blog.csdnimg.cn/direct/b63044b00ee54e86aea7262f1fb4d228.png
        然后创建一个下面如许的表:
create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10, 2) not null default 0.0
);
https://i-blog.csdnimg.cn/direct/9070039e98254e6d9f46de9d08a1550c.png
事件正式操作

利用一个案例来看如何操作事件:
rollback to

我们先启动事件
start transaction; https://i-blog.csdnimg.cn/direct/1a852400911d4748ab6b2c2dc9627b22.png 
设置生存点
savapoint 名称; https://i-blog.csdnimg.cn/direct/bbdd8166e5894fd0abeb1026e5ebf29a.png 
 插入数据之后再设置一个生存点
insert into account values(1, '张三', 1234.5);
savepoint s2; https://i-blog.csdnimg.cn/direct/c64541a2f7004946a735eab6d7951b43.png 然后再插入数据, 同时设置生存点:
insert into account values(2, '李四', 4321.6);
savepoint s3;
insert into account values(3, '王五', 5432.7); https://i-blog.csdnimg.cn/direct/ead10a8b52684a819386f000e15d6042.png 此时观看表中, 就看到数据都插入进来了:
https://i-blog.csdnimg.cn/direct/86ec4b0251be4e9a84f7c49833811d95.png
问题是, 假如本日我悔恨了, 我不想插入李四和王五了。 我们怎么做呢? 就可以使用定向回滚, 回滚到我们设置的某一个生存点处。 
rollback to s2; https://i-blog.csdnimg.cn/direct/4a97edaae790462f906fea3ed436c846.png 
我们再查看表中数据, 就没有李四和王五了!        
https://i-blog.csdnimg.cn/direct/1df6a173efb244f4bb71bbcf90baf120.png 
然后事件结束之后, 我们不想要回滚了, 就像直接提交了。 我们就可以使用commit
commit; https://i-blog.csdnimg.cn/direct/7b340b42c656465eb29f370bfcce20f3.png
rollback

然后我们也可以直接rollback把从开始到如今所做的操作全部放弃掉。
start transaction;
insert into account values(1, '张三', 1234.5);
insert into account values(2, '李四', 4321.6);
insert into account values(3, '王五', 5432.7);
https://i-blog.csdnimg.cn/direct/20ed0e4495134a57a2720619f410be40.png
https://i-blog.csdnimg.cn/direct/86243306f64c4912b80e0659247c1807.png
rollback; https://i-blog.csdnimg.cn/direct/e8c8c305a35943cb90e31030d5c1ef4e.png https://i-blog.csdnimg.cn/direct/d685365d5bcb4461b350564c4fbc4c17.png
commit长期化

然后我们再启动事件。 这一次我们插入数据后直接提交。 然后再回滚:
start transaction;
insert into account values(2, '李四', 4321.6);
insert into account values(3, '王五', 5432.7);
commit;
//ctrl + \ https://i-blog.csdnimg.cn/direct/2eddc72b7a2748679e3a50105a964a54.png
https://i-blog.csdnimg.cn/direct/faf06835b0c04c528475a5b959c0aa5d.png
我们就会看到, 即便我们举行了回滚,数据也没有变革。 即:只要事件提交了, 就完成了长期化, 事件无法回滚!!!
事件非常

   
        我们要做的实验就是我们正在启动有一个事件。 但是客户端挂掉了, 莫名瓦解掉了。 这个时间mysql是怎么处置惩罚的。 以是我们就先插入一条数据, 然后ctrl + ‘\’, 让mysql客户端瓦解。 如下:
start transaction;
insert into account values(4, '赵六', 6666.6);https://i-blog.csdnimg.cn/direct/0d9640f321d84ad599ea7c35d5311af9.png
然后我们再查看表数据, 会发现, 新插入的数据没有提交, 没有长期化。 也就是完成了自动回滚。 
https://i-blog.csdnimg.cn/direct/85dfd79cdc1f422980da89c1c9441b69.png 
        直接关掉终端也是一样的, 但是截图不了。 友友们自行测试。
    这一次, 我们先commit, 再非常退出:
start transaction;
insert into account values(4, '赵六', 6666.6);commit;//ctrl + \
https://i-blog.csdnimg.cn/direct/0362eb338f4142f6a921966307894887.png
效果可以预见, 完成了长期化:
https://i-blog.csdnimg.cn/direct/bb1f2af7949948c7b1bc0b62d9fc6c6a.png
        默认情况下, 提交方式是自动提交:
show variables like'autocommit'; https://i-blog.csdnimg.cn/direct/ad2f64c76a4340b2b995c0aad6eae368.png
        但是, 对于事物的提交类型。 自动提交不影响我们的begin和commit。 对于begin也就是手动开启的事件来说, 我们收到开启, 就得手动commit。也就是说, 即便我们将set autocommit = 0,效果也不会有什么不同。  
自动提交和不自动提交

如今我们来谈一下自动提交和不自动提交有什么用。 如今来一组对比试验:
先看自动提交:
show variables like 'autocommit'; https://i-blog.csdnimg.cn/direct/7772f2b37cfa49159f803698b6a21ae6.png
我们再另一个客户端上面启动一个事件, 然后查看当前表的数据:
https://i-blog.csdnimg.cn/direct/2bbfdf37aa1347b5974e5006229d3720.png
然后回到原来的客户端删掉id为1的数据:
delete from account where id = 1; https://i-blog.csdnimg.cn/direct/44fc637da23245b5a2bdfb78fbd872a1.png
这个时间我们停止这个客户端。
show variables like'autocommit'; https://i-blog.csdnimg.cn/direct/b7107e15cf5744659e053ed86a919f2c.png
然后去另一个客户端查看表数据, 会发现, 刚刚删掉的数据确实没了:
https://i-blog.csdnimg.cn/direct/393bbb023d6847f0942dc8ad40be0b93.png
这个符合我们的预期。 
但是我们再来看另一个实验, 这个时间设置为手动提交:
设置手动提交, 然后删除数据, 最后停止客户端。 
set autocommit = 0;
delete from account where id = 2;
//ctrl + \ https://i-blog.csdnimg.cn/direct/6ff968cd31ec44ccbd1e70a5d3ce8cb1.png
我们去检查另一个客户端的数据,表中数据是否被删除:
https://i-blog.csdnimg.cn/direct/950a637b5e8248cb92ecc1be86605bc6.png
可以看到, 并没有被删除。 
           通过上面我们的征象, 我们可以推测, autocommit影响的是我们的单sql。 实在我们从前的sql语句, 都是一个事件。 这个事件默认是自动提交的。 并且我们能看到mysql的两大特性。 一个是原子性, 一个是长期性。   
https://i-blog.csdnimg.cn/direct/15c30d55dc9d4d3e88d963c86879480d.png
——————以上就是本节全部内容哦, 假如对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】深度学习数据库开发技能:mysql事件穿透式解析