事务是一组操作集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

  • 开启事务:START TRANSACTION 或 BEGIN;(作用于增、删、改)

  • 回滚:ROLLBACK;

  • 提交事务:COMMIT;

事务四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态。

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,他对数据库中的改变就是永远的

上述就是事务的四大特性,简称ACID

并发事务问题

脏读:一个事务读取到另外一个事务还没有提交的数据。

不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同。

幻读:一个事务按照查询条件查询数据时,没有对应数据行,但是在插入数据时,又发现这行数据已经存在,好像出现“幻影”。

事务隔离级别

查看事务隔离级别

 SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

 # 设置隔离级别
 SET [ SESSION | GLOBAL ]
 TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
 ​
 # 打开两个会话,事务隔离级别设置为 READ UNCOMMITTED(读未提交)
 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 ​
 # 查看当前会话的事务隔离级别
 SELECT @@TRANSACTION_ISOLATION;
 ​
 # 设置全局事务隔离级别
 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 ​
 # 查看全局事务隔离级别
 SELECT @@GLOBAL.TRANSACTION_ISOLATION;

注:事务隔离级别越高,性能越低,数据越安全。

MYSQL支持4种事务隔离级别,默认的隔离级别为可重复读

  • READ UNCOMMITTED(读未提交)

    • 允许读取未提交的数据,可能会遇到脏读。

  • READ COMMITTED (读已提交)

    • 只能读取到已经提交的数据,可以避免脏读,但可能会出现不可重复读的问题。

  • REPEATABLE READ(可重复读)(默认级别)

    • 保证在同一个事务中,多次读取同一数据的结果是一致的,可以避免不可重复读的问题,但可能会出现幻读。

  • SERIALIZABLE (可串行化)

    • 最高的隔离级别,完全避免脏读、不可重复读和幻读,但性能较低。

级别

脏读

不可重复读

幻读

read uncommitted (读未提交)

read committed (读已提交)

repeatable read (可重复读)

Serializable (可串行化)