MySQL学习笔记3【事务】

82 阅读2分钟

MySQL笔记


事务

多条mysql语句合并成一条事务,变成一个整体,要么全部执行成功,要么全部失败。


使用方式

方式一(推荐):

  • 开启事务: START TRANSACTION 或 BEGIN TRANSACTION;

  • 提交事务: COMMIT;

  • 回滚事务: ROLLBACK;


方式二

  • 查看事务提交方式 SELECT @@AUTOCOMMIT;

  • 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效 SET @@AUTOCOMMIT = 0;

  • .......(此处注册相关语句到事务中)

  • 提交事务

    COMMIT;

  • 回滚事务

    ROLLBACK;


四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

并发事务问题

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同
幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在,好像出现欢迎
事务隔离级别
隔离级别脏读不可重复读幻读
Read uncommit
Read committed
Repeatable Read(默认)
Serializable
  • Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

设置事务隔离级别:

SET 
[ SESSION(当前会话) | GLOBAL(全局) ] 
TRANSACTION ISOLATION LEVEL 
{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };

这里最好去实践一下,可以帮助理解,以下是关于我的理解:

  1. READ UNCOMMIT:两个事务完全并行,A事务会读取到B事务临时提交但并未COMMIT的数据。

  2. READ COMMITTED:解决了脏读,A事务只会读取到已经COMMIT的数据。

  3. REPEATABLE READ:解决了不可重复读,我理解为将开启事务时的数据作为数据源,从中查询,相当于快照,但是与此同时会出现幻读的情况,也就是在B事务已经COMMIT之后,A事务无法查询到B事务操作之后的数据,所以会导致信息不一致,比如说没有查询到id(主键)为3的数据,然后在这之后,B事务插入了id为3的数据,此时A事务再插入id为3的数据,就会出现错误,但是在A事务中,无论怎么查询,都不会查到id为3的数据。

  4. SERIALIZABLE:让事务变成线性执行,相当于要排队来执行,与此同时,性能最差。