- 定义:
事务(Transaction)是指作为一个逻辑单元执行的一系列操作,这些操作要么全部成功,要么全部失败。事务确保对多个数据的修改作为一个单元来处理。
1、在MySQL中,只有InnoDB存储引擎的数据库支持事务
2、事务用于维护数据库的完整性,保证成批的sql语句要么都执行,要么都失败
3、事务用于管理UPDATE、INSERT、DELETE
- 事务的特性:
1、原子性(A):事务中的操作,要么都做,要么都不做
2、一致性(C):事务完成后,要保证所有数据保持一致状态
3、隔离性(I):事务互相独立,互不干扰
4、持久性(D):事务完成后,对系统的影响是永久性的
- MySQL事务控制:
1、MySQL默认情况下是自动提交事务的
2、查看事务状态:select @@autocommit
3、如果要开启一个事务,使用begin或者start transaction,或者set autocommit=0
4、对于一个事务,要么commit,要么rollback
- MySQL事务并发带来的问题:
1、脏读:事务A可以读取到事务B未提交的执行结果,即读取未提交的数据。
2、不可重复读:事务A只能读取到事务B已提交的执行结果。事务A执行同样的查询,在事务B提交之前、提交之后,会得到不同的查询结果。
3、幻读:事务A读取不到事务B未提交、已提交的执行结果。这会产生一个新的问题,即事务B插入一条数据并提交,事务A查询不到事务B提交的数据,也无法插入同样的数据,产生“幻读”。
- MySQL的事务隔离级别 :
MySQL的事务隔离级别有4种,由低到高分别是读未提交、不可重复读、可重复读和串行化。
MySQL默认的事务隔离级别是可重复读。 - 不同隔离级别可能产生的问题:
- 说明:
在不可重复读的隔离级别下,Innodb使用MVCC和next-key locks解决幻读,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。 - 设置事务隔离级别:
从MySQL 5.7.20开始,就增加了变量 transaction_isolation 作为 tx_isolation 的别名。从MySQL 8.0开始,变量 tx_isolation 被弃用并删除,使用 transaction_isolation 表示事务的隔离级别。
MySQL 8.0
#查看事务隔离级别
select @@transaction_isolation;
#或者
show variables like 'transaction_isolation';
#设置事务隔离级别
set transaction_isolation ='read-uncommitted';
MySQL 5.x
#查看事务隔离级别
select @@tx_isolation;
#设置事务隔离级别
set tx_isolation ='read-uncommitted';