事务的概念
事务是相关联的一组串行操作,不可分割,要么一起成功获取到想要的结果,要么失败还原成最开始的情况。
以转账为例:张三去银行给李四转账1000块,整体操作需要先查询张三的账户余额有没有1000,则不存在后续的转账给李四账户余额增加1000的过程;如果张三的账户存在1000元,则张三的账户减去1000,李四的账户加上1000,完成转账过程。
事务的四大特性(ACID)
原子性:事务是数据库最小的操作单元,要么操作全部成功,要么全部失败;
一致性:所有操作执行完后保证数据一致,例如上面的转账,张三李四转账前后金额总数要保持一致;
隔离性:事务之间不能相互影响,例如张三李四两人转账,王五赵六也在给彼此转账,一组转账不管成功或失败都不得影响到另一组;
持久化:事务中操作数据库修改数据不管成功修改还是失败导致的回滚都会将数据保存到磁盘上。
并发导致的问题
脏读:A事务读到了B事务未提交的数据;
不可重复读:A事务读取一条数据,B事务修改了这条数据并提交,A事务再次读取同一条数据,前后两次读取的数据不一致;
幻读:A事务查询一条数据,查询结果为空,此时B事务插入了该数据并提交,A事务再插入该数据时提示数据已存在,再去查询数据确实存在了,好像产生了幻觉一样
事务隔离级别
读未提交:会出现脏读、不可重复读和幻读;
读已提交:会出现不可重复读和幻读(Oracle的默认事务隔离级别);
可重复读:会出现幻读,该事务隔离级别中同一条数据A读取出来后,B事务修改并提交,A事务再次读取的结果和第一次一致,不受B事务影响,如果A事务像读取到修改过的值,需要提交事务后重新读取(mysql默认的事务隔离级别);
串行:序列执行,不存在并发,故不存在并发问题,但对性能影响较大;
手动开启事务的指令:start transaction;
手动提交事务:commit;
手动回滚:rollback;