MySQL事务
事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end ransaction语句(或函数调用)来界定。事务由事务开始(begintransaction)和事务结束(end transaction)之间执行的全体操作组成。(百度)
简单讲事务就是MySQL
多条操作封装在一起,成为一个事务!!!
也就是多条sql
语句就可以组成一个事务!
为什么使用事务
有些MySQL
操作,不得不需要多条sql
才能执行成功!
比如我们需要转账操作!
显然这样的操作,在mysql
需要分两步执行!!!
假设:阿里巴巴需要给四十大盗转账2000元!!
第一步:
阿里巴巴账户余额减少2000
!
第二步:
四十大盗账户余额增加2000
如果我们的第一步操作就失败了!显然此时转账失败了!
我们第二步的操作就没有意义了!
所以我们需要将这两个操作打包成一个事务!
如果sql_1
执行成功了,那么再执行sql_2
!
那如果sql_1
执行失败了咋整呢?
放心,我们的mysql
数据库有专门的表记录下了sql_1
操作,数据库系统会自动将该操作回滚
即复原!!!
事务特性:
四大特性:
- 原子性
因为我们通常认为原子是不可再分的,这里就是认为事务是最小单元了! - 一致性
就刚刚的转账操作,账户1和账户2中的余额总数要和转账前相同,不能无故增加或减少!!! - 隔离性
多个事务并发之间是隔离的!
就是当,双方转账的同时,另一方再转账给其中一人,那么此时就不可执行! - 持久性
执行该条事务后,如果不进行二次更改,那么该数据就持久有效了!
使用
如何设置执行一个事务呢?
- 开启事务
sql语句
start transaction;
- 执行多条
sql
- 回滚或提交:
sql语句
rollback/commit;
rollback
即是全部失败,commit
即是全部成功。
commit
事务提交成功!!
rollback
撤销该事务
并发执行事务可能带来的问题(面试)
我们知道事务有隔离性的特点!!!
我们知道隔离性越好,那么事务之间的并发性就低!!!
什么是并发执行呢?
我们知道我们的计算机可以同时开启多个进程(程序)!
我们可以听着歌,打开IDEA,打开CSDN写博客!!!
我们计算机是很擅长一心多用!!多个进程并发执行!!!
而如今的计算机CPU
也是取向多核发展!!
就是同时并发执行的程序可以更多!!
而事务间也有并发!
联系我们生活,很多事情我们可以同时并发执行!但是有些事情需要先后顺序执行,不然会很多问题!!
事务并发也是如此,有可能出现一些问题!
- 脏读问题
什么是脏读呢?
顾名思义就是读了一个脏数据!就是错误的数据!!
什么情况下会出现脏读呢?
比如高中,考了考试,你正在订正答案,学委在黑板上抄答案,你在你的试卷上改!他写,你抄.你抄完后,发现学委把答案改了,他刚刚抄错答案了! 你刚刚读的答案就是一个脏数据!!!
我们画一个时间轴便于理解!!!
解决方案:
我们可以对写操作进行加锁!!!便可以处理脏读问题!!!
就是说我们等学委将答案全部抄完! 我们再进行读答案!!!
- 不可重复读
当我们学委写完答案,你开始抄答案不久时间后,老师和他说有一个答案有更好的解法!让学委重新写一份!可这时你已经在抄了好多了!你就一整个大无语!!!
解决方案:
给读操作加锁!
我们和学委商量,他写答案的时候我们不看!我们抄答案的时候他就不可以改了!!!
- 幻读问题
当学委写完数学答案后,我们再看数学答案时,他又在写英文答案,此时你就看岔行了!把英文答案看成了数学答案抄了,出现了幻读问题!!!
解决方案:
再次和学委商量,咱抄答案时他不能写!!!我们抄时他不能写!!!
使读和写操作直接串行化了!!!
显然此时的隔离效果最后!! 但是并发最慢!!!
隔离性和并发两者需要平衡!!!
- 点赞
- 收藏
- 关注作者
评论(0)