关于数据库的事务
这里简要的说明下数据库事务存在的原因:
因为对于一个业务来说,往往一条dml语句无法直接满足这个业务的要求,需要多条dml语句才行,所以这个时候就需要事务来进行管理了。
如果一个或者同一个事物中的多个dml操作(新增、删除、修改)没有设置事务的话,它会默认自动提交,这个自动提交是不支持回滚的。
如果一个或者同一个事物中的多个dml操作(insert、delete、update)设置了事务的话
start transaction 命令用来关闭事务的自动提交
committ transaction 提交事务
rollback transaction 回滚事务(只能回滚到最后一次提交事务时的数据库各表单记录)
讲到事务肯定就要讲到事务的四大特性了
acid
原子性
事务的最小单元,不可切割
隔离性
隔离性指的是两个事务之间的隔离性(下面会具体的讲解下隔离级别)
一致性
一致性指的是在一个事务中,所有的dml操作要么同时成功,要么同时失败
持久性
持久性指的就是,当事务结束后,这里的结束指的的不管是失败还是成功,数据都要保存在数据库中才行(成功了就是成功的数据,失败了就是事务提交之前的数据)
关于事务的隔离级别
事务的隔离级别都有哪几种
读未提交(基本上不被使用)
大概意思就是事务a可以读取到事务b还没有结束时,对数据库进行操作的数据
引发的问题:事务b都没有提交,读取到的数据是脏数据,脏读指的就是这个
读已提交(oracle默认的事务隔离级别),解决了上面的脏读问题
大概意思就是事务a可以读取到事务b结束之后的数据库数据,但是每次读取到的数据可能会不一样(这里的不一样指的是,事务a第一次去读取数据库的时候,可能事务b还没有结束,这个时候读到的数据可能是只有1条,但是事务a再去读取数据库的时候,可能事务b已经结束了,这个时候读取到的数据可能就是2条了),这样就产生了 不可重复读 问题
可重复读(mysql默认的事务隔离级别),解决了上面的不可重复读问题
大概意思就是,事务a没有结束之前,在事务a中读取到的数据都是一样的,不管事务b,事务c怎么去操作数据库数据,只要事务a还没有结束,读取到的数据都是一样的,这样会引发的问题就是拿到的数据可能不是真实的数据,因为数据库数据可能已经被别的事务给修改过了,这就产生了幻读问题
序列化/串行化
大概意思就是,事务a在操作数据库的时候,就不能对数据库进行其它操作了(包括增删改查),保证绝对的安全。这样做的话安全级最高但是效率最低。