本部分主要讲解mysql数据库中的进阶知识和实际操作1:事务。
2.事务的ACID
- 一致性:类似银行转账,张三的钱转给李四,张三的钱要减少,李四的钱要增加;
- 隔离性:张三给李四转钱,张三选好数额,还没点提交,李四应该查不到收到钱了;
- 持久性:张三给李四转钱,一旦转账成功,就拿不回来了,只能找银行处理;确认这件事发生了,就存在磁盘里面了;
二、事务的使用
2.1 概念
- mysql默认事务是开启的,一条SQL语句一旦按下回车,就表示这个发生了;
- 自己去写事务,要手动去开启事务,感觉哪个事务错了,就要进行回滚,
2.2 操作
2.1.1 原来的表
2.2 操作
2.1.1 原来的表
2.1.2 步骤
经过这几步操作之后:【黄色框线中】此时表中数据并未改变;
- start transtion 先开启了事务; 后面两句update是合并成了一个事务,实际表中数据还没动,体现事务隔离性;
- 最后事务确认完成,加一句commit,这就不能改变了
结果就是:
三、提交及回滚事务
3.1 概念
3.2 操作
原表:张三5000;李四1000;
CMD运行以下代码:
- 但是在Navicat里面,新建的查询还是:
之所以CMD是3000,Navicat是5000,是因为cmd是后台看的,Navicat是客户看到的;
且事务只对DML语言有效,对DQL这种select查询语言无效;
- 再运行一句:
- 如果此时因不可抗力,坏掉了:就要进行回滚rollback,这就撤回了事务;
3.3 事务流程图
四、事务的并发操作
要设置隔离级别,以免让后台的有些操作被客户看到,出现数额先增后减的情况;
4.1 事务的并发问题【多人同时去做某一件事情】
4.1.1 脏读案例
老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,
该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,
以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交
实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读.
4.1.2 脏读解决办法【read committed】
- 四种隔离级别【级别权限从低到高】:
read uncommitted读不可提交【脏读模式】;read committed读提交;repeatable read重复读【这个是默认】; serializable串行;
- 查看隔离级别:select @@global.tx isolation,@@tx isolation;
- 修改隔离级别:【一个会话是一个小窗口;全局是指整个数据库里面】
4.1.3 脏读演示
- 此时有:
- 下一步:后台这样
此时李四在自己APP上查到多了2000块钱
转账的人发现不应该转2000,就自己撤回了
李四自己什么都没干,再查了一遍就发现钱又变少了
4.1.4 大多数用读提交模式【开发中不用脏读模式】
此时李四在自己的APP上同时查看时,账上并没有多出2000