您的位置:首页 > 数据库

事务的特性和隔离级别

2018-03-10 09:17 190 查看

事务的四大特性ACID()

原子性(Atomicity):

事务是数据库的最小逻辑工作单元,也是最小程序执行单元,事务中包括的诸多操纵要么全做,要么全不做,不能再次进行分割.

一致性(Consistency):

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态;大家都是说一致性和原子性密切相关,还体现在,多个与此数据相关的服务器相关数据都要更新

隔离性(Isolation):

一个事务的执行不能被其他事务干扰;

持续性/永久性(Durability):

一个事务一但提交,它对数据库中数据的改变就应该是永久性的。

事务的三种情况

脏读(dirty read)

一个事务读到另一个事务未提交的数据

允许事务B可以读到事务A修改而未提交的数据,可能会造成了脏读。脏读本质就是无效的数据,只有当事务A回滚,那么事务B读到的数据才为无效的,所以这里只是可能造成脏读,当事务A不回滚的时候,事务B读到的数据就不为脏数据,也就是有效的数据,脏数据会导致以后的操作都会发生错误,一定要去避免,不能凭借侥幸,事务A不能百分之百保证不回滚,所以这种隔离级别很少用于实际应用,并且它的性能也不比其他级别好多少。

在博客看到这个描述,我感觉只要数据不提交,这个数据就不应该被读到,所以,就算不回滚,读到别人未提交的数据,也是脏读!

不可重复读(no-repeatable read)

在一个事务连续的读取操作中,读取的数据发生变化(其他事务修改了数据)

举个例子,事务A开启,读取到数据;然后事务B完成,成功改变了数据,这时候事务A再次读取,读取到了被事务B改变之后的数据

幻读(phantom read)

在一个事务连续的读取操作中,数据库中的数据发生变化(其他事务对表格进行增删)

幻读和不可重复读很相似,我看了很多微博,尝试做出自己的解释,不可重复读主要原因是其他事务修改了他即将要再次查询的值,导致查询到了新值;而幻读,举个例子:其他事务添加了一条数据,导致事务两次查询数量不一致;另一个例子:事务先查询有没有id(主键)为123的数据,如果没有就添加一条,但是添加前,其他事务完成了对id为123数据的提交,这时候,你再添加数据,就会出现错误

事务的四种隔离级别

1)Read uncommitted(未提交读)—–>脏 重 幻

2)Read committed (提交读)———->重 幻

4)Repeatable read(重复读)———->幻

8)Serializable(序列化)—————–>

上面就是4个隔离级别和在此隔离级别下可能出现的情况

需要注意的,安全性越好,处理速度就越慢,因为1的安全性太差,8的处理速度太慢,所以这两个隔离级别很少使用

另外需要注意的,MySQL默认的级别是4-重复读;SqlServer,Oracle等大部分数据库使用的是2-提交读
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息