事务

什么是事务

事务是用于保证数据的一致性,它有一组相关的dml(update、delete、insert)语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据。

基本操作

start transaction --开始一个事务
savepoint 保存点名 --设置保存点
rollback to 保存点名 --回退事务
rollback --回退全部事务
commit --提交事务,所有的操作生效,不能回退

回退事务

使用rollback to 保存点(savepoint)可以回退到指定的位置上,当结束事务时(commit),会自动的删除该事务内所定义的保存点,不能再回退。

细节

  1. 如果不开启事务,默认情况下,dml操作是自动提交(commit)的,不能回滚
  2. 如果开启一个事务,在没有创建保存点的情况下也可以执行rollback,默认就是回滚到事务开始的状态
  3. mysql的事务机制需要innodb存储引擎,MyISAM不支持
  4. 开始一个事务是start transaction,也可以写成set autocommit=off。

事务隔离级别

什么是事务隔离级别

  1. 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
  2. 如果不考虑隔离性,可能会引发如下问题:
    脏读(dirty read):
    当一个事务读取另一个事务尚未提交的修改时,会产生脏读
    不可重复读(nonrepeatable read):
    同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
    幻读(phantom read):
    同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读

事务隔离级别

mysql 返回字段转化驼峰格式 mysql回退到某个点_数据库

查看当前事务隔离级别

#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