MySql事务
-
什么是事务?
即为一段代码块在执行过程中同时结束并不报错,要么同时成功,要么同时失败
-
为什么需要事务?
为了考虑数据的安全性,比如转账时,付款和收款要同时成功
-
事务怎么使用?
-- 声明事务 start transaction; sql 1, sql 2, ..... commit; -- 提交事务 -- 如果上述代码中有错误则回滚 rollback; -- 回滚点,如上述代码 sql1,sql2 如果执行失败回滚需要从 sql1 开始 如果想从别的地方开始可以给 sql语句之间添加回滚点 -- 如下 start transaction; sql 1, sql 2, savepoint R1; sql 3, ..... commit; rollback R1; -- 回滚后 事务将从 sql 3开始执行
MySQL隔离级别
- 读未提交 产生 : 脏读 ,不可重复读,幻读
- 读已提交 解决了 脏读 存在:不可重复读 ,幻读
- 可重复读 解决了 脏读,不可重复读 存在: 幻读
- 串行化 解决所有
-
读未提交 产生问题,脏读 不可重复读 幻读
A,B同时开启事务 A可以读到 B未提交的数据
如上图,A,B均操作临时库 所产生的数据均从临时库读取,所以有脏读现象
-
读已提交 解决了脏读问题 , 读取未提交数据
A,B同时开启事务 开启事务,相当于创建了一块临时空间,用来存储数据库中的数据
如果没有提交事务,则该临时空间内修改的数据,仅限于内存中,并不会持久化到数据库中
-
可重复读 解决了 不可重复读问题 即为 同一数据,如若A一直提交修改,则B每次读的值不一样
-
串行化 解决幻读问题
什么是幻读,即为上述图,A事务 插入了一条数据student id为1 , 当B也想插入这条数据时,失败 ,但是查询结果为空。即出现了幻觉,这条数据在临时库查不到,但确实持久化到了数据库中
串行化,就是排队,事务A结束,才能开启事务B