前言
Hi,大家好,我是说话最土的IDEA操作工,今天给大家介绍关于事务的一些事儿,同时也作为自己的笔记。希望大家阅读后可以不惜言语指出错误或提出建议!
一、嘛叫事务?事务是个嘛玩意儿?
事务:一条或多条SQL语句组成一个执行单元,要么都成功,要么都失败。诶,换句话说就是,比如我插入一批数据,其中有一条没插进去,那其他的都插不进去。
二、事务的四大特征
1.原子性
原子性就是对数据的这顿操作,要么全部成功,要么全部失败回滚。
2.一致性
执行前和执行后都必须处于一个一致性状态。嘛意思?举个栗子,转账这事儿,A和B,俩人一共2000大洋,执行之前是2000,A给B转账500,那转完之后俩人一共还得是2000,少一分就急!
3.隔离性
多个并发事务之间要相互隔离。介事儿后面会提到,记着有这码事。
4.持久性
持久性,一旦提交,就是永久性的,即便突然断电了(就和我刚才一样!)数据还得有!!
三、事务的隔离级别
这个就是上面说的第三个特征,隔离性。请看下面这张表。
隔离级别 | 名称 | 会引发的问题 |
---|---|---|
read uncommitted | 读未提交 | 脏读、不可重复读、幻读 |
read committed | 读已提交 | 不可重复度、幻读 |
repeatable read | 可重复读 | 幻读 |
serializable | 串行化 | 无 |
这个表是有规律的,背一下也是可以滴,当然如果理解了这些“会引发的问题”,那记起来简直轻轻松松,再也不怕面试官!
四、问题助解
1.脏读
先说说嘛叫脏读,脏读,就是读取了别人修改后,但没commit的数据!可怕不,再用转钱这事举个栗子。
说小张儿跟小李一人有1000大洋,小张儿跟小李借500,小李就借了,小李说那你给我写个借条吧,小张儿面带笑容忙着答应,并写了欠条。这时,小张儿有1500大洋,小李有500大洋,事后,小张儿把欠条撕了不认账了,完蛋,小李死无对证,还少了500块。
这个事对应到咱们事务中就是,A修改数据还没提交(1500,500),此时B读取数据(1500,500),然后A将数据回滚了,真实的数据是(1000,1000),而B却认为是(1500,500)。
以上就是读未提交带来的事故!
2.不可重复读
这是在事务处于“读已提交”的状态下。读取了其他人提交之后的数据。
诶,那我们说这挺正常啊,人家没提交,你说有脏读,不对。这回提交了怎么还不对呢?
有个公司的销售,周一老板说开会,小张赶紧查查数据表里这个季度部门的营业额,1000万!美滋滋的等着老板表扬了,小李和小张一个部门,听说要开会,想起有次自己的一个大额商品遭到大量退货,损失得有几十万,赶紧改改数据库,这个时候小张已经坐在办公室跟领导吹上了。会上,老板打开数据表一看,小张他们部门的营业额是900万,小张一下傻眼了。。
这就是B读取了数据,在其他人再次改了数据之后,没读到引发的事故。
3.幻读
幻读在事务处于可重复读的状态下发生。
这个很好理解,A插入一条数据“1,张三”,但是还没提交。B也想插入这条数据,他先查了数据表里没有这条数据,于是进行插入,可是一直不成功。这时A提交了数据,B那边提示插入失败,因为数据表里有这条数据里。B处于糊里糊涂的状态。
总结
好了,以上就是今天要分享的内容,希望通过这几个小故事可以让大家理解事务,也希望在评论区看到大家的建议和指导。我们下次再见咯~