MySQL事务

事务

  • 事务是一组操作的集合,它是一个不可分割的工作单位,事务会将一组操作作为一个整体向系统提交或撤销请求,这组操作要么同时执行要么同时失败

@@autocommit系统自动提交事务的开关

-- @@autocommit参数可以开启与关闭自动提交事务的(系统默认为开启)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.01 sec)

-- 关闭
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

事务操作

方式一:关闭了@@autocommit=0

-- 关闭了系统自动提交事务,使用commit提交事务,出现异常使用rollback回滚操作
mysql> update account set money=money-1000 where name='张三';
mysql> update account set money=money+1000 where name='李四';
mysql> commit;

-- 模拟语句执行中发生异常
mysql> update account set money=money-1000 where name='张三';
mysql> 发生异常了。。。。
mysql> update account set money=money+1000 where name='李四';  #此时这条语句未执行
mysql> rollback;  #回滚事务

方式二:开启@@autocommit=1

-- 系统默认开启自动提交事务,使用begin 或 start transaction手动开启事务,commit结束,rollback回滚
mysql> begin;
mysql> update account set money=money-1000 where name='张三';
mysql> update account set money=money+1000 where name='李四';
mysql> commit;

事务的特性(面试)

  • 原子性:系统必须视事务为最小的执行单元,事务中有任何语句执行出错都必须返回到事务执行前的状态。
  • 一致性:在事务处理时,无论成功还是失败,都必须保证数据库系统不会返回到一个未处理的事务中,mysql的一致性通过日志机制来实现。
  • 隔离性:在并发处理多个事务时,多个事务间互不影响,保证未完成的事务与数据库系统隔离。
  • 持久性:事务一旦提交或撤销,这样的修改是永久性的。

并发事务问题

  • 脏读:一个事务读取到另一个事务还未提交的数据。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的结果不一致(其他事务已提交修改)。
  • 幻读:一个事务在查询一条记录时,没发现记录行,但是在执行插入或删除该条数据时,发现该记录已经存在(其他事务插入或删除数据)。

事务隔离级别

隔离级别 脏读 (Dirty Read) 不可重复读 (Non-repeatable Read) 幻读 (Phantom Read)
读未提交 (Read Uncommitted) 可能 可能 可能
读已提交 (Read Committed) 不可能 可能 可能
可重复读 (Repeatable Read) 不可能 不可能 可能
序列化 (Serializable) 不可能 不可能 不可能
-- 查看事务隔离级别
select @@transaction_isolation

-- 设置事务隔离级别语法
set [session|global] transaction isolation level [read uncommitted|read committed|repeatable read|serializable]

session:表示只在当前会话的隔离级别
global:表示全局会话的隔离级别
posted @ 2025-03-31 20:09  逃离这世界~  阅读(17)  评论(0)    收藏  举报