第一个概念:事务:把一个或者多个sql语句作为一个不可分割的整体,如果其中的某一条sql语句执行失败或者产生错误,整个执行过的sql将会回滚,所有受到影响的数据将会返回到事务开始以前的状态。
第二个概念:事务的四大特性ACID(原子性、一致性、隔离性、持久性)。
我重点说一下这个隔离性:就是说一个事务的执行不会受另一个事务的干扰。
第三个概念:数据库的隔离级别分为4个等级,分别如下:
1.read uncommited:最低的隔离级别,可以读未提交事务的数据,支持的并发访问最大,但是可能会出现脏读、可重复读、幻读问题。
2.read commited:优先级高于read notcommited,只能读已提交事务的数据,可能会出现可重复读、幻读问题。
3.repeatable read:优先级高于read commited,mySql默认的数据库隔离级别,可能会出现幻读问题。
4.serializable:可串行化,这是最高的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,但是一般不会用它,因为并发性很差。
我先说一下什么叫脏读,“脏读”见名知意,读到的数据是脏东西,那为啥会读到脏东西呢,就是因为开启了最低离别的隔离事物read uncommited,从这个单词意思就能看出来,可以读未提交事物的数据,比如说你执行了一个sql语局更新了一条数据但是此时你并没有执行commit(这里我说一下,大多数数据库默认的都是自动commit提交事物的,可以设置为手动的,我记得mysql设置的命令应该是set autocommited=1还是啥,反正可以查),这个时候我执行了select语句查询了你更新的这条数据,后来你并没有commit那条修改,而是rollback回滚了本次修改,这个时候我查看到的是你就是你零时修改的记录而不是真正有意义的记录,读到的这个结果就是脏数据,用read commited的隔离级别可以防止出现脏读。
我再说一下什么叫不可重复读,我这里用select语句读了一个结果,你那里恰好更新了我读的这条记录的结果,并且提交了更改,相同的select语句我第二次又执行了发现跟我第一次读到的数据不一致了(这里需要注意一下,我两次执行相同的查询语句是在我这同一个事物下发生的),用repeatAble read的隔离离别就可以防止这个可重复读问题。
我最后再说一下什么是“幻读”个,幻读就是两次执行的同一个查询的sql查到的结果条数不一致,仿佛出现了幻觉一样,它实际上跟上面的可重复度是同样的理解,只不过幻读是我这个两次执行的查询的sql语句查的一般都是记录的数量,而你更新的数据可能是插入了或者删除了某些数据,刚好在我查询的那个结果的数量里边,影响了我查询到的条数。