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
人生没有白走的路,每一步都算数
恐惧是万恶之源