事务
1.1 事务相关概念
1.什么是事务
多个SQL作为整体,要么都成功,要么都失败。
2.事务特性
原子性,一致性,隔离性,持久性
3.事务隔离级别
1 未提交读
2 已提交读
4 可重复读
8 串行化,也叫不可并发
隔离级别越高,越安全,性能越低。
Mysql默认隔离级别4,Oracle默认2。
- 没有事务会出现的问题
数据丢失
脏读
不可重复读
幻读
- 模拟两个用户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;