代表单个工作单元的一组SQL语句,在事务中的语句都应成功完成。
属性(ACID):

  • 原子性(Atomicity) 事务不可中断,要么事务中所有语句被执行,要么事务被退回,执行的更改被撤销
  • 一致性(Consistency) 数据库状态保持一致
  • 隔离性质(Isolation) 事务之间彼此不受干扰,且一次只有一个事务可更新同样的数据(互斥)
  • 持久性(Durability) 事务产生的更改是永久的

创建事务

1
2
3
4
5
START TRANSACTION; -- 开启事务 

-- 要执行的语句

COMMIT; -- 关闭事务

常见并发问题

  • 脏读(Dirty Reads)
    • 事务读取了尚未被提交的数据
  • 不可重复读(Non-repeating Reads)
    • 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致
  • 幻读(Phantom Reads)
    • 事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行
  • 丢失更新
    • 同时有多个事务更新同样的数据,后提交的事务覆盖先前的事务
  • 死锁
    • 多个事务拿着不同事务需要更新数据的锁
    • 出现原因:
      • 多个事务里对于同样的数据采用相反顺序进行更新
    • 解决方案:
      • 更新多条记录时采用相同顺序
      • 简化事务,缩小事务运行时长
      • 安排运行时长长的事务(基于大表)在非高峰时段进行

事务隔离级别

设置事务隔离级别

1
2
3
4
5
6
7
SHOW VARIABLES LIKE 'transaction_isolation'; -- 查看数据库的事务隔离级别

SET TRANSACTION ISOLATION LEVEL [隔离级别] -- 为某个事物设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别]
-- 为会话或连接设置隔离级别
SET GLOBAL TRANSACTIOn ISOLATION LEVEL [隔离级别]
-- 设置全局隔离级别
  • 读未提交(READ UNCOMMITED)
  • 读已提交(READ COMMITED)
  • 可重复读(REPEATABLE READ)
  • 序列化(SERIALIZABLE) 只在解决幻读问题的情况下使用该级别