1.事务的理解:

事务就是一段sql的批处理,考虑到现在的很多程序或软件都是多线程的,对于同一个表可能同时有多个人在操作,为了保持数据的一致性,我们提出这个事务

2.事务的四大特性(ACID):

1)原子性:一个事务必须视为一个不可分割的最小工作单元,这个事务的操作要么全部提交成功,要么全部失败回滚

2)一致性:数据库总数从一个一致性的状态转换到另一个一致性的状态

3)隔离性:一个事务在进行修改等操作时,对于其他事务来说是不可见的,也就是说其他事务不能与这个事务同时进行修改

4)持久性:一个事务操作完成一旦提交之后,对数据库的修改就是持久的,不能再后悔回滚的

3.事务的操作

1)开启事务:begin

2)执行对数据的操作,如修改删除等

3)确认操作提交:commit

4)回滚操作:rollback在确认提交之前我们可以在后悔回滚,但是一旦事务提交之后就不能再回滚了

4.事务的隔离级别

在介绍隔离级别之前我们需要先搞清楚几个概念

1)脏读:脏读指的是现在有a,b两个事务,b对数据进行了修改但是还未提交,这个时候a对这个数据进行了查询,查到的时b修改后的数据,这个时候b后悔回滚了,数据又恢复到之前的数据,那么a读到的数据就是脏的

2)不可重复读:事务a重复读取一个数据,在这个事务还没有结束之前,事务b对这个数据进行了修改并且进行了提交,这个时候a接着读,读到的是b修改的数据,这样就造成了a前后读的数据不一致,这叫不可重复读

3)幻读:a事务对数据表总的所有数据进行修改,这个事务还没进行完的时候,b事务又向这个表中插入一条数据,这个时候a事务发现这个表中还有没被修改的数据,就好像产生幻觉一样,这个就是幻读

注:这里不可重复读与幻读容易混淆,不可重复读强调的是修改数据,二幻读更注重插入或者删除数据

事务有四个隔离级别,如下面表格所示

隔离级别 脏读 不可重复读 幻读
读未提交
读已提交
可重复读
串行化

上面的隔离级别是依次增强的,也就是说串行化的隔离级别是最强的,但是我们通常不会用到他,当我们使用串行化的隔离级别的时候,三种情况都不会发生,读未提交是最低的隔离级别,当我们选择这种隔离级别的时候,这三种情况都会发生.mysql默认的隔离级别是可重复读

查询事务的隔离级别

1)查询全局的隔离级别select @@global.tx_isolation

2)查询会话的隔离级别select @@tx_isolation

修改事务的隔离级别

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL