一、事务
事务用于保证数据的一致性,它由一组相关的dml组成,该组的dml语句要么全部成功,要么全部失败:转账。
事务和锁:当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据
mysql数据控制台事物的几个重要操作
1、start transaction -- 开始一个事务
2、 savepoint 保存点名 --设置保存点
3、rollback to --回退事务
4、 rollback --回退全部事务
5、 comiit -- 提交事务,所有操作生效,不能回退
回退的过程中,会删除回退点之前的保存点
#讨论事务细节
-- 1、如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
INSERT INTO t27 VALUES(3,'milan');
SELECT * FROM t27;-- 上一节rollback已经回退到开始事物的点了,所以只有新添加的一条数据
-- 2、如果开始一个事务,你没有创建保存点,可以执行rollback,默认就是回退到事务开始的状态
START TRANSACTION
INSERT INTO t27 VALUES(4,'kitty');
INSERT INTO t27 VALUES(5,'scott'0:
ROLLBACK;-- 表示直接回退到事务开始的状态,因为中途的dml操作没有设置保存点,只有开始状态的默认保存点
-- 3、你也可以在这个事务中(还没有提交时),创建多个保存点,比如:savepoint
-- 执行dml,savepoint bbb
-- 4、你可以在事务没有提交前,回退到任何一个保存点
-- 5、innoDB存储引擎支持事务,myISAM不支持
-- 6、开始一个事务:start transaction, set autocommit=off
二、事务的隔离级别
(1)介绍
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离事务,以保证各个连接在获取数据时的准确性
如果不考虑隔离性,可能会引发:
脏读:dirty read,当一个事务读取另一个事务尚未提交的修改时,产生脏读
不可重复读:nonrepeatable read, 同一查询在同一事务中多次进行,由于其他连接提交事务所做的**修改或删除,**每次返回不同的结果集,发生不可重复读
幻读:phantom read 同一查询在同一事务中多次进行,由于其他连接提交事务所做的**插入**,每次返回不同的结果集,产生幻读
(2)四种隔离级别
1)设置隔离级别为读未提交
幻读现象:另一个控制台应该只能读到本控制台事务开始的情况,但是本控制台发生操作后,另一个控制台也能捕捉到,这是不行的。
2)改变隔离级别为读已提交:在插入一条数据后,另一个控制台看不到
3)可重复读
演示不可重复读
4)可串行化:当一个连接正在操作数据库,并且没有commit时,另一个连接无法查询;一提交就可以查了