数据库操作事物的四大特性以及MySQL数据库的四种隔离级别
1 、事物操作数据库的四大特性(ACID)
1.原子性 (Atomicity)
原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚。
2.一致性 (Consistency)
一致性:简单来说就是在事物执行前和执行后,必须保持数据的一致。
举个例子:A和B之间进行转账,A和B的钱加起来一种是2000块钱,那么无论他们之间 进行了多少次的转账操作,最后的钱数加起来应该还是等于2000。
3.隔离性 (Isolation)
隔离性:一个事物执行的过程当中,不能被其他的事物干扰。比如有事物A和事物B,相对于A来说,你B想要执行,要么在我执行之前执行,要么在我执行完毕之后,你再开始执行。
4. 持久性 (Durability)
持久性:事物被提交之后,他就被永久的存储到了数据库当中。
2、不考虑事物的隔离性所引发的问题
1. 脏读
一个事物读取到了一个未提交的事物的数据。
2. 不可重复读
在读取数据库的某条数据的时候返回了不同的值,造成这个结果的原因是因为我们在查询了一次之后准备进行第二次查询的这个间隔之间,对我们要进行查询的这条数据进行了修改操作,从而导致两次读取的数据不一致。
脏读和不可重复读的区别:
脏读是一个事物读取到了一个未提交事物的脏数据,而不可重复读是一个数据读取了一个已经提交了的事物的数据。
3. 虚度(幻读)
出现幻读不是对一条数据的操作而产生的问题,而是操作多条数据产生的问题,例如:事物A想要对一张表中的某一字段的值进行修改,假设有一个字段的值全部为1,事物A现在想要将1全部修改为2,在提交事物之后,事物B接着又进行了一个操作,在这张表中添加了一个字段,值全部为1。那么这时候操作事物A的用户在查看的时候,会发现还有一行数据没有进行修改,其实这是事物B在他查看之前添加的。
幻读和不可重复读都是读取了一个已经提交的事物,而脏读是读取了一个未提交的事物。不同的是不可重复读查询的是同一条数据,而虚读查询的是批量数据。
3、MySQL数据库的四种隔离级别
1、 Serializable (串行化):可避免脏读、不可重读读、幻读的发生
2、 Repeatable read (可重复读):可避免脏读、不可重复读的发生。
3、 Read committed (读已提交):可避免脏读的发生。
4、 Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种的隔离级别最高的Serializable,最低的是Read uncommitted,级别越高,虽然安全级别越高,但是执行的效率就越低,MySQL中默认的隔离级别是:Repeatable read(可重复读),oracle默认的隔离级别是:Read committed(读已提交)。
这里需要注意的是,mysql支持以上四种隔离级别,但是oracle只支持Serializable(串行化)和Read committed(读已提交)这两种隔离级别。
MySQL中查看当前的事物隔离界别
![](https://pic1.zhimg.com/80/v2-9ae926dd3ec5bda073b757301837e8a6_hd.jpg)
设置mysql的隔离级别
![](https://pic2.zhimg.com/80/v2-d5d211e7350cde5004903de08d22ead0_hd.jpg)
记住:设置数据库的隔离级别一定要是在开启事物之前!
隔离级别的设置只对当前的链接有效。对于MySQL窗口来说,一个窗口就是一个链接,当前设置的事物隔离级别只对当前的窗口有效。