事务
什么是事务
事务是用于保证数据的一致性,它有一组相关的dml(update、delete、insert)语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。
事务和锁
当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据。
基本操作
start transaction --开始一个事务
savepoint 保存点名 --设置保存点
rollback to 保存点名 --回退事务
rollback --回退全部事务
commit --提交事务,所有的操作生效,不能回退
回退事务
使用rollback to 保存点(savepoint)可以回退到指定的位置上,当结束事务时(commit),会自动的删除该事务内所定义的保存点,不能再回退。
细节
- 如果不开启事务,默认情况下,dml操作是自动提交(commit)的,不能回滚
- 如果开启一个事务,在没有创建保存点的情况下也可以执行rollback,默认就是回滚到事务开始的状态
- mysql的事务机制需要innodb存储引擎,MyISAM不支持
- 开始一个事务是start transaction,也可以写成set autocommit=off。
事务隔离级别
什么是事务隔离级别
- 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
- 如果不考虑隔离性,可能会引发如下问题:
脏读(dirty read):
当一个事务读取另一个事务尚未提交的修改时,会产生脏读
不可重复读(nonrepeatable read):
同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
幻读(phantom read):
同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
事务隔离级别
查看当前事务隔离级别
#Mysql
SELECT @@tx_isolation;
#Mysql 8.0后
SELECT @@transaction_isolation;
修改事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
全局修改事务隔离级别
全局修改需要在my.ini配置文件里修改,必须在[mysqld]后添加
#可选参数:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction-isolation = REPEATABLE-READ