事务
事务是逻辑上的一组操作,所谓一组即是说明这一组操作具有逻辑上的关系,例如原子性:组成事务的逻辑单元不可分割。隔离性:事务的执行不应该受到其他事务的影响。一致性:事务执行前后,数据完整性保持一致。持久性:事务一旦提交后,就会持久化(保存)到数据库中。
事务并发引起的安全问题
事务的概念是相对于多个事务并发而言的,离开多个事务这个前提来讨论事务是没有意义的
1.脏读:A读到了B正在update但是未commit的数据,举个例子:A老板正在给B发工资5000元,B此时查自己账户上有了5000元,A老板发现B的工资应该是2000元,进行了rollback。这里的B查到的5000元就是脏读数据。
2.不可重复读:通俗的讲不可重复读意思是,同一个事务重复读取同一数据时出现了前后不一致的问题。举个例子:A查到自己账户上有2000元,打算去消费,此时C盗刷(update)了A的2000元,并提交了事务(commit),A结账的时候账户的2000变成了0,这里前后两次查询到的数据不一致就是不可重复读的问题。
3.重复读(幻读/虚读):这个概念和不可重复读容易混淆,对比的来说。
不可重复读指的是A事务读到了B事务已经update并commit的数据,导致前后两次读取同一数据不一致。
虚读指的是A事务读到了B事务insert并commit的数据,导致前后两次读取同一数据不一致。
事务的隔离级别
read uncommitted :啥都避免不了,脏读,不可重复读,虚读都会出现
read commited : 只能避免脏读(oracle,SqlServer默认都是折翼级别)
repeatable read :能避免脏读和不可重复读(mysql默认)
serializable :(序列化)啥都能避免,有点类似于单线程,性能最低
在实际编程中遇到的问题:
mysql和oracle在update或insert、delete后都要commit,但是mysql的工具例如,sqlyog和navcat默认都自动提交,操作完后不需要手动commit,oracle的工具 plsqldeveloper 默认没有自动提交,只有当手动commit或者关闭当前SQL window时才会提交
作者:kk爱自由
链接:https://www.jianshu.com/p/b216cb4c6cff