数据库已经使用两年多了,今天刚刚把事务的隔离级别搞清楚真是有点说不过去,今天把体会写在这里:
说到事务的隔离级别先说一下事务在并行运行中会遇到的个问题
关于脏读这个非常好理解,就是事务A在读取数据的时候读取到了其它事修改了但还没有提交的数据,未提交的数据有可能被回滚所以称之为脏数据,这也是脏读的由来吧(大概)
关于不可重复读
举个例子--如果事务A有两个阶段
1 select XXX from table where id = 1 ;
2. select XXX from table where id = 1 ;
上面的两条语句在同一个事务中。按理说应该返回的数据应该一样,
但是在事务A执行到阶段1后,阶段2之前 ,如果有另一个事务修改了 id 等于1的这条数据并且已经提交了。就会造成 两个阶段查询产生的数据不一样。不可重复读就是一个事务中两次同样的语句中出现了不同的结果
关于幻读
同样一个事务A有两个阶段
1. select XXX from table where id between 1 and 10
1. select XXX from table where id between 1 and 10
同样上面的两个语句 在执行到1后2前时候,其它的事务 删除了或增加了 id在1至10内的记录 那么两个阶段产生的查询结果是不同的
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交(Read uncommitted) | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
所谓的事务隔离级别其实就是 改变了其它事务在执行过程中对自己的事务的影响方式。同时也改变了自己事务对其它事务的影响方式
如果把自己事务隔离级别改为读未提交。则在自己事务的执行过程中能过读取其它任何事务未提交数据(不管其它事务的隔离级别)
读已提交则相反只能读其它事务已经提交的事务
如果把自己的事务设置为可重复读则在自己的事务未结束之前,其它的事务可以查询但不能更改被自己事务锁定(应该是共享锁)的记录
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。