MySQL基础--事务

这些都是我自学时手打到文本文档,在复制粘贴到博客的,有一些命令格式不对,但全部百分百原创,如果有疑问或者不对的地方,欢迎评论区指正,也可以加q群592383030来探讨(我就是自学的普通人,不卖课,不涉及补习机构)

我会出一整套mysql的学习过程,从基础的sql语句,约束,函数,事务。到进阶的存储引擎,sql优化,索引,存储过程,锁,触发器,视图甚至lnnoDB引擎的详解和一些运维方面的比如,mha主从,读写分离;mmm双主,pxc MySQL高可用,zabbix,elk监控MySQL。如果有需要来我主页,有帮助到您就关注我点个赞。

    一,事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体,一起向系统提交或撤销,所以这些操作要么同时成功,要么同时失败。
例子:张君杰给胡雅欣转账10k,
先检查张君杰账户余额有没有10k,
如果足够再把张君杰余额减去10k,如果不足直接失败
再把胡雅欣余额增加10k

比如在第三步服务崩溃了,张君杰的余额扣除,但胡雅欣余额并无增长,就出大问题了
为了杜绝这种情况,就使用事务。
先开启事务
在把这三步命令写入(此时会对这三步临时执行,数据都临时更改)
如果成功就提交事务;如果失败,就数据回滚(也就是临时数据撤回成原始数据)三条全部不生效。

系统默认关闭事务,所以我输入各种sql语句,一执行马上生效。
想实现上面所说把多条命令写在一个事务里,就需要手动开启事务,并且写完手动提交事务,如果出现异常还要手动回滚事务。

                                                  二,事务操作
还是上面的转账例子,第一步:查询张君杰余额
select  *  from  账户表名  where  name=’张君杰‘;
查询账户表的所有字段,加条件名字字段=张君杰。这样就找出了张君杰账户的所有信息
第二步:将张君杰余额减去10k
update  账户表名  set  余额字段 = 余额字段 -10000  where  name=‘张君杰’;
修改账户表的余额字段  =  赋值(余额-10000)加上条件名字字段=张君杰。就完成了更新张君杰的账户,余额字段-10000。
第三步:给胡雅欣账户加10k
update  账户表名  set  余额字段 = 余额字段 + 10000 where  name=’胡雅欣‘;
修改账户表的余额字段  =  赋值(余额+10000)加上条件名字字段=胡雅欣。就完成了更新胡雅欣的账户,余额字段增加10000.

这三步依次执行已经可以完成需求。但是现在它们每一句sql都是单独的事务,不出问题可以执行,一旦出问题就麻烦了。
比如在第三步执行错误,第二步已经执行完了,张君杰钱扣了。但是第三步执行错误,胡雅欣没收到钱,那就是bug了,所以需要用事务把三句sql变成整体,共进退才行。

所以就需要控制事务,有两种方法:
方法1,系统默认自动条件事务(就导致每一句sql都是单独的事务),所以把系统默认改成手动,就可以通过命令来调用事务,自定义长度了。
select  @@autocommit                  查看事务的调用方式(如果回报1,就是自动提交;如果回报0,就是手动提交)
set  @@autocommit = 0;             这就是修改这个值,比如上一步报1是自动,通过这一步改成0,就切换到手动了。
commit;                                        这就是手动提交参数,用鼠标把需要的sql语句连带这个参数都括起来,但是此参数必须放在最后,执行即可
rollback;                                       事务回滚,临时数据发生错误,使用回滚。

注意!!!一旦改成手动提交,所以sql配置均临时生效(不写入数据库),可以先跑一遍临时,没有报错都没问题,就手动提交即可(手动提交就写入数据库了)
像上行所说,临时过一遍,如果没错,就手动提交;如果出现错误了,就用数据回滚,恢复数据。
用法都很简单,都一样直接加在后面。就是看临时的时候,成功就提交,失败就回滚。

方法2,不去修改提交方式,用指令操作事务。
start  transaction 或者 begin;                开启事务
commit;           提交事务,与方法一一样
rollback;        回滚事务,与方法一一样
这种方法用起来也简单,先用start  transaction开头,代表开始统计下面的sql语句,到一个事务。
中间写具体sql语句
然后直接用鼠标把开头和sql语句,划到一块执行,(就相当于方法一的临时执行,如果全部成功就提交;如果失败就回滚)

                                                  三,事务四大特性
原子性(atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
一致性(consistency):事务完成时,必须所有数据都保持一致状态,比如上一章的转账案例,转账操作之后,两个账户总额不变。(两个账户一个30k,转完帐总额还是30k)
隔离性(isolation):数据库系统提供的隔离机制,挺深的后面会细讲。说白了计算多个事务同时进行,不会互相影响(有隔离级别,后面细说),各事务都运行在独立空间内。
持久性(durability):事务一旦提交或回滚,它对数据库中的数据改变是永久的。
取首字母,并成为acid

                                                  四,并发事务引发问题

比如多个事务,同时操作一个数据库甚至一张表,引发的问题
常见的问题有三个
脏读:一个事务读到另一个事务还没有提交的数据
比如事务a,update修改表但是还未提交;此时事务b,查看表,但是查到了事务a还未提交的更改后数据
不可重复读:一个事务先后读取同一条记录,但是两次读到的数据不同
比如事务a第一句和第三句sql都是查表,此时事务b在事务a第二句执行时,修改了数据并且提交。导致事务a前后查询结果不一致
幻读:一个事务按照提交查询数据时,没有对应的数据行,但是插入数据时,又发现对应数据行已存在。
比如此时已经解决不可重复读问题,就导致事务a先查表内id为1的数据,发现没有。紧接着就创建id=1的数据。但是此时事务b恰巧执行了创建id=1数据的命令,导致事务a创建失败,因为解决了不可重复读,隔离了。所以还是查不到,并且也创建不了。


                                                  五,事务隔离级别

事务隔离级别专门解决类似上一章的各种并发问题
read  uncommitted(读未提交)         性能最好但最不安全,脏读,不可重复读,幻读全部有可能出现
read  community(读已提交)             可以解决脏读,但是不可重复读和幻读依旧可能出现
repeatable  read(可重复读)              可以解决脏读和不可重复读,但是幻读问题还可能出现
serializable(串行化)                          性能最差,但是全部问题都解决,安全性最高
需要根据数据类型和需求去给隔离等级。
查看当前系统变量信息              select @@
查询事务隔离级别                    select @@ transaction_isolation
设置事务隔离级别
set  【session(仅当前会话生效)或者global(全部会话生效)】transaction  isolation level 【上面提到的级别名】;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值