Mysql 中的事务,是面试官的考察点,下面让我们来详细了解一下事务。
一、事务的基本概念
事务:一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
二、事务的四大特性(重点)
1、原子性:事务是一个不可分割的单元,其中的操作要么全部执行,要么一个都不执行。
2、隔离性:一个事务的执行不能被其他事务所干扰。
3、一致性:事务必须使数据库从一个一致性状态变换成另一个一致性状态。
4、持久性:一个事务一旦被提交,它对数据库的数据进行的操作就是永久性的。
三、事务的分类
数据库中的事务分为两大类:
(1)隐式事务:事务没有明显的开启和结束的标记,如update,insert,delete语句等。
(2)显式事务:事务具有明显的开启和结束的标记。
四、显式事务的创建
前提条件:将数据库的自动提交功能为OFF;
首先,查看数据库的自动提交是否开启:
SHOW VARIABLES LIKE 'autocommit'
如果value为OFF即为关闭状态,如果value为ON,则为开启状态,此时每次开启事务时需要将此功能禁用,代码如下:
set autocommit = 0;
说完前提条件,我们来讲一下创建步骤:
1、禁用自动提交功能。
set autocommit = 0;
2、开启事务(此步骤可以省略)
START transaction;
3、编写事务中的SQL语句
4、结束事务(分为提交,回滚,设置保存点三种)
#结束事务-提交
COMMIT;
#结束事务-回滚
ROLLBACK;
#设置保存点
SAVEPOINT a;
……(SQL语句);
#回滚的保存点
ROLLBACK TO a;
注意: savepoint必须与rollback连用,没有commit to。
五、事务的隔离级别(重点)
对于同时运行的多个事务,当这些事务访问数据库中相同的数据是
如果没有采用必要的隔离机制,就会倒置各种并发问题:
1、脏读: 对于两个事务T1,T2,若T1读取了已经被T2更新但是还没有提交的字段之后 若T2过滚,T1读取的内容就是临时且无效的。
2、不可重复读: 对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后T1再次读取同一个字段,值就不同了。
3、幻读: 对于两个事务T1,T2,若T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后如果T1再次读取同一个表,就会多出几行。
事务的隔离级别:
数据库提供了四种隔离级别:
名称 | 描述 |
READ UNCOMMITTED(读未提交数据) | 允许事务读取未被其他事务提交的变更,以上三种并发问题均会出现。 |
READ COMMITTED(读已提交数据) | 只允许事务读取已经被其他事务提交的变更,可以避免脏读。 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取想的的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读的问题依然存在。 |
SERIALIZABLE(串行化) | 确保事务可以多次从一个表中读取相同的行,在这个事务持续期间,禁止其他事物对该表执行插入更新删除操作所有并发问题都可以避免,但是性能十分低下。 |
Oracle支持的两种事务隔离级别:READ UNCOMMITTED(默认) 和 SERIALIZABLE。
Mysql支持四种事务隔离级别,默认为REPEATABLE READ
六、MySQL查看和修改数据库的事务隔离级别
1、在Mysql中查看数据库的事务隔离级别,代码如下:
select @@tx_isolation;
未设置过的MySQL数据库的隔离级别默认为REPEATABLE-READ。
2、在Mysql中修改数据库的事务隔离级别,代码如下:
#修改本次连接的隔离级别
set session transaction isolation level READ UNCOMMITTED;
#修改全局的隔离级别
set global transaction isolation level READ UNCOMMITTED;
再次查看隔离级别: