事务

1.1        事务相关概念

1.什么是事务

       多个SQL作为整体,要么都成功,要么都失败。

2.事务特性

原子性,一致性,隔离性,持久性

3.事务隔离级别

       1 未提交读

       2 已提交读

       4 可重复读

       8 串行化,也叫不可并发

隔离级别越高,越安全,性能越低。

Mysql默认隔离级别4,Oracle默认2。

  1. 没有事务会出现的问题

数据丢失

脏读

不可重复读

幻读

  1. 模拟两个用户A,B

假设上面的黑窗口是A,下面的黑窗口是B。

两个窗口都执行set autocommit=false;

在Test数据库中建立一张表t_student;

在t_student表中Insert into t_student values(0,“tom”,22)

 

场景一:A要修改id=0数据的年龄为23,B要修改为24,

        如果A执行为update语句,还没有执行commit操作,B如果执行update语句,此时窗口会卡住,如果没有卡住,也可以执行,则为数据丢失。

 

 

场景一:A修改id=0的数据22为23后,提交commit操作,B来读取id=0数据的age值,此时查询到的还是22,因为mysql默认的隔离级别是4,可重复读。在B的事务过程中是可以对同一条数据重复读取的。

        如果同样的场景B可以读到A提交的23,那么即为读已提交。

        如果同样的场景A还没有commit,只是执行了update语句,B就可以读到23了,那么即为脏读。

        假设同样的场景A提交commit前后,B和C在很短的时间错开进行了两次count(),这两次统计不一样,即为幻读。(解决幻读需要加表级锁)

 

获取行级锁写法:

select * from t_student where id=0 for update;

posted @ 2021-08-13 14:54  monkey66  阅读(27)  评论(0编辑  收藏  举报