概念
什么是事务?
在mysql中,事务是一种确保数据库操作序列的原子性,一致性,隔离性和持久性的机制。主要是处理操作量大,复杂度高的数据;事物、务可以包括一个或者多个数据库操作,例如插入更新或者删除记录;
为什么需要事务?
事务可以保证成批的SQL语句可以全部执行,要么全部执行,要么全都不执行,比如删除一个人员信息,既要删除基本资料,又要删除相关信息,可以放到事物、务中一起执行,保证数据库的完整性;
事务的特征(ACID)
- 原子性:事务要么执行,要么失败,不可拆分
- 一致性:数据库在任意的时间都保持一致性
- 隔离性:事务之间的执行互不影响(与隔离的级别有关)
- 持久性:事务一旦执行完毕,对数据库是永久性的改变,不可恢复
原子性、隔离性、持久性都是为了一执行服务;
事务的操作
1.开启事务
事物默认是开启的:
on表示开启,没有开始和结束的标记,一条insert,update,delete。也就是说一条SQL语句默认就是一条事务;如果关闭autocommit,就不会自动commit:
#关闭自动开启的事务
set autocommit = 0;
#开始事务
insert 。。。
update 。。。
#多条SQL语句
commit 或者 rollback 都会关闭事物;
commit提交事务,rollback回滚,也就是什么都不执行;
案例1: 在autocommit=ON的情况下,需要手动开启一个事务,以commit或者rollback提交事务;
我们开启一个事务,把表删除,查询为空,rollback回滚,事务结束,再次查询发现数据还在; 注意: :数据定义语句不适用于rollback,因为他们会立即进行执行,只有数据操纵语句能rollback;commit之后会永久生效;
2.使用保留点
如果事务中的SQL语句很多,我们只需要部分回退,可以使用rollback to savepoint会退到声明savepoint的地方。
案例2:
3.事务的隔离性
事务与事务之间的执行应当相互隔离,不能相互干扰,查看未提交的数据;其中写和写的隔离使用锁的机制来实现,读和写的隔离使用MVCC实现:
3.1脏读
事务A读取到事务B还没有提交的数据;
3.2 不可重复读
事务A读取两次数据,在两次的间隔中,事务B更新了数据,造成两次读取不一致的问题;
3.3 幻读
事务A对同一集合数据进行两次读取,在读取之间,事务B增加或者删除了数据,A事务的两次读取得到不一样的行数据;
3.4 隔离级别
隔离性通过不同的隔离级别来实现,这些级别定义了事务之间可以观察到的并发操作的可见性;
可通过命令 set transaction_isolation= 'xxx';来设置隔离的级别,级别越高,隔离度也越高,并发性能会很低,需要考虑实际的应用场景具体判断;
- 读未提交:在这个级别上,事务可以读取到其他未提交事务的更改,会导致脏读
- 读已提交:只能读取到其他事物已经提交的更改;可以避免脏读,但不可避免不可重复读的问题
- 可重复读:事务可以看到一致的数据,但不能避免幻读;
- 串行化:最高的隔离级别,事务依次顺序执行,提供了最严格的隔离,但可能会严重影响性能;