事务:
概念:是一组sql语句的集合,我们要完成一个数据操作的时候,可能需要通过多条sql完成,也就是说对数据库一个功能操作的整体叫做事务。
特性:ACID
- 原子性:事务具有不可分割特性, 要么全部完成,要么全部不完成。
- 一致性:事务开始到结束,数据库的完整性没有被破坏,结果要符合预期;基于原子性
- 隔离性:防止事务并发执行时由于交叉执行而导致的数据不一致
- 持久性:事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失
原子性&一致性的实现:可以通过加锁以及异常事务回滚操作完成,保证事务要么不做,要么一次性完成;
持久性:持久化存储(保证事务一旦完成将不可回滚)
事务的隔离性
隔离性:并发处理。
事物的并发处理会出现什么问题:脏写,脏读,不可重复性读,幻读
- 脏读:读取到了其他事物还没有提交之后的修改结果
- 不可重复读:一个事务在不同的时间,读取同一个数据得到不同的结果,我们就说这是不可重复读
- 幻读:指同一个事务在不同时间段得到的结果条数不同
隔离级别:
Mysql数据库针对并发操作提供了四种隔离级别
- 读未提交--不加锁,什么问题都没解决
- 读已提交--解决不了脏读,依然存在不可重复读和幻读问题
- 可重复读--不加锁,解决了脏读,不可重复读,幻读的问题,基于mvcc
- 串行化--加锁,强制串行化执行,解决了所有问题
可重复读
Mysql的默认隔离级别是可重复读;
可重复读的实现思想:这个隔离级别解决不可重复读和幻读的原理---基于MVCC ---多版本并发控制
mvcc的实现思想:
- 每张表中都有三个隐藏字段:DB_TRXID(创建该记录的事务ID),DB_ROW_ID(隐藏主键),DB_ROLL_PTR(回滚指针)
- mysql会为每个事务都生成一个事务ID,事务ID是持续增长的(越往后的事务,事务ID就越大)
- 新来的事务查询数据的时候,会交给他一份当前活跃的事务id数组--哪些事务未提交,新事务就会通过回滚指针,在undo日志中找寻已完成的事务的数据,然后取这个数据
- undo日志的删除是所有比自己大的事务都提交了才会删除掉
通过以上操作:
辨别数据当前的操作事务是否已经提交,来决定是获取当前数据还是 从undo日志中获取比自己ID小已提交的事务数据,解决了不可重复读的问题;通过只获取比自己事务id小的事务的数据,来解决幻读的问题
事务操作:
- 开始事务:begin;
- 保存事务回滚点:savepoint pos_name;
- 提交事务:commit;
- 回滚事务到指定的版本:rollback to pos_name;
- 回滚事务:rollback;
下来自己再练练 !
事务未提交,随时都可以回滚,并且异常未完成事务,数据库在重启后也会自动回滚; 事务一旦提交根据持久性,数据将持久化存储,无法实现回滚;