概念:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败
事务和锁:当执行事务操作时,mysql会在表上加锁,防止其它用户改表的数据
mysql数据库控制台事务的几个重要操作
1.start transaction -- 开始一个事务
2.savepoint 保存点名 -- 设置保存点
3.rollback to 保存点名 -- 回退事务
4.rollback --回退全部事务
5.commit -- 提交事务,所有的操作生效,不能回退
回退事务:保存点是事务中的点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点,当执行回退事务时,通过指定保存点可以回退到指定的点
提交事务:使用commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁、数据生效,当使用commit语句结束事务后,其它会话将可以查看到事务变化后的数据
-- 开始事务
start transaction;
-- 设置保存点
savepoint a;
-- 事务中的操作
insert into index_use values(1,'tom');
savepoint b;
insert into index_use values(2,'jack');
-- 回退事务
rollback to b;
-- 提交事务
commit;
事务注意事项:
1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
2.如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到事务开始状态
3.也可以在这个事务中(没有提交)创建多个保存点
4.可以在事务没有提交前,选择回退到哪个保存点
5.mysql的事务机制需要innodb的存储引擎
隔离级别:
1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
2.如果不考虑隔离性,可能会引发如下问题:
脏读:当一个事务读取另一个事务尚未提交的修改时,产生脏读
不可重复读:同一查询在同一事务中多次进行,由于其它提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
幻读:同一查询在同一事务中多次进行,由于其它提交事务所做的插入操作,每次返回不同的结果集,此时产生幻读
| 隔离级别(4种) | 脏读 | 不可重复读 | 幻读 | 锁 |
| 读未提交 Read uncommitted | √ | √ | √ | 不加锁 |
| 读已提交 Read committed | × | √ | √ | 不加锁 |
| 可重复读 Repeatable read | × | × | × | 不加锁 |
| 可串行化 Serializable | × | × | × | 加锁 |
查看当前会话隔离级别:select @@tx_isolation;
查看系统当前隔离级别:select @@global.tx_isolation;
设置当前会话隔离级别:set session transaction isolation level repeatable read;
设置系统当前隔离级别:set global transaction isolation level repeatable read;
mysql默认的事务隔离级别是repeatable read,一般情况下,没有特殊要求则无需更改
事务的acid特性:
1.原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3.隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能呗其它事务的操作数据所干扰,多个并发事务之间要相互隔离
4.持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不能对其有任何影响