傻子学编程(一)之数据库事务特性ACID和隔离级别

版权声明:原创文章版权所有,转载请注明出处。 https://blog.csdn.net/ma726518972/article/details/86582325

自本日起打算写一篇《傻子学编程》系列文章,用傻子都能听懂的白话,而不是一些抽象的概念,让大家看完就能懂,看完就会用。

tip:说一下什么是事务,有些同学可能不理解事务是什么意思。

就是我们的一个方法里面有很多的增删改查,如果给这个方法添加事务,那么这个方法的执行就遵循事务的特性。

1.事务的四大特性(原子性(Atomicity)、一致性(Consistency)、隔离型(Isolation)、持久性(Durability))简称ACID。

原子性:事务中的操作不可拆分,只允许全部执行或者全部不执行。举个例子:如果一个事务有5条update语句,5条delete语句,他们中有一条语句执行失败,那这10条语句都全部失败,操作全部失效。

一致性:也称完整性,事务的执行不会破坏数据库的一致性。举个例子:如果一个方法添加了事务,里面有一条insert语句,一条update语句,当他执行到insert语句的时候,并不会执行,只有走完这个方法的最后一句,所有的操作的语句统一执行,这就是事务的一致性。

隔离性:指并发的事务相互隔离,不能互相干扰。举个例子:两个相同的事务同时并发执行,一定是一个先执行,另一个再执行,保证事务之间是隔离的,不会互相干扰的,主要是一些插入,修改操作,而不是读取操作。

持久性:指事务一旦提交,对数据的状态改变是永久的。举个例子:这个没什么说的,就是将数据插入到持久层介质,就是将数据插入到数据库,那肯定就是永久的咯,不会说一会数据就消失了。

2.事务的隔离级别(读未提交(Read Uncommitted),读已提交(Read Committed),可重复读(Repeatable Read),串行化(Serializable))

读未提交:就是说一个事物修改了数据,但是还没有提交,再另一个事务中select语句,会读到这个未提交的数据(称为脏读

所以说,读未提交是最低级的!

读已提交:读已提交是为了防止脏读的产生,事务读取的数据只能是其他事物都已经提交过得数据,不存在还没有提交的数据被读取。但是这样会产生不可重复读

不可重复读是指同一个select方法,前后查询的数据不同,数据不能重复读,站在数据层面理解,就叫不可重复读。

产生这个的原因,举个例子:当一个事务A正在提交数据,但是还没有提交,这个时候另一个事务B是读取不到事务A正在准备提交的数据,这时候事务B读取到10调数据,然后事务A完成了提交,事务B又做了一次select查询,数据变成了11条,这就是数据的不可重复读。

可重复读:当然,这个就是为了解决数据不可重复读的问题。可重复读是指在一个事务A中,select查询的结果是事务开始的数据,尽管事务过程中有了很多的其他新数据提交,但是在当前事务中的select语句查询都是事务开始的数据,这样就保证了数据的可重复读,不存在select数据前后不一致的样子。但是,这回产生会有幻读现象。

什么是幻读?其实幻读可以说就是一种视觉现象,事务A的隔离级别是可重复读,在他执行这个事务的过程中,其他事务有修改或添加新的数据,但事务A获取到的数据始终是事务A开始时候的数据,当事务A结束后,发现数据库里突然多了很多数据,仿佛出现了幻觉,所以幻读可以就理解为一种肉眼看到的现象。

串行化:这个很简单了,就是把事务串起来,一个一个执行,这样数据就不会乱了。

注意:虽然事务隔离级别越高,越能保证数据的一致性,但事务隔离级越高,对并发性能影响越大,在这中间必须做一些取舍。

所以现在的大多数数据库的隔离级别是Read committed 读已提交,只要是提交的数据都可以读,但是不保证数据的重复读,比如比如Sql Server , Oracle。

Mysql的默认隔离级别是Repeatable read 可重复读,保证整个事务的过程中,数据的读取都是事务开启时候的一样。

猜你喜欢

转载自blog.csdn.net/ma726518972/article/details/86582325