mysql-数据库隔离级别


介绍下数据库隔离级别以及各隔离下的问题,以及mysql的默认隔离级别

隔离级别

  • Serializable:串行化
    • 强制事务排序,串行化读写,避免冲突
  • Repeatable read:可重复读
    • 同一事务的多个实例在并发读取事务时,会“看到同样的”数据行
  • Read committed:读已提交
    • 一个事务开始时,只能“看见”已经提交事务所做的改变
    • 一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交
  • Read uncommitted:读未提交
    • 所有事务都可以“看到”未提交事务的执行结果

各隔离级别下的问题

见以下表格:

隔离级别 问题 脏读 不可重复读 幻读 加锁读
Serializable no no no yes
Repeatable read no no yes no
Read committed no yes yes no
Read uncommitted yes yes yes no
  • 脏读:一个事务处理过程里读取了另一个未提交的事务中的数据
  • 不可重复读:在一个事务的两次查询中数据不一致
  • 幻读:幻读是事务非独立执行时发生的一种现象,如事务T1批量对一个表中某一列列值为1的数据修改为2的变更,
    但是在这时,事务T2对这张表插入了一条列值为1的数据,并完成提交
    此时,如果事务T1查看刚刚完成操作的数据,发现还有一条列值为1的数据没有进行修改

默认隔离级别

Mysql默认隔离级别:Repeatable read
sql server默认隔离级别:Read committed

如何设置隔离级别

(1)方法一

  1. 使用vi打开mysql配置文件
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
  2. 在文件的最末尾添加如下配置, 指定mysql数据库的隔离级别为READ-COMMITTED(transaction-isolation=READ-COMMITTED);可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
  3. 在终端中重启mysql服务
    sudo service mysql restart

(2)方法二:

  1. 进入mysql终端
  2. 设置隔离级别,可选的参数READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

文章作者: Xudong Jiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xudong Jiang !
 上一篇
缓存策略-缓存算法介绍 缓存策略-缓存算法介绍
今天介绍下缓存算法 FIFO算法 进先出(FIFO,队列),是最简单、最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小。空间满的时候,最先进入的数据会被最早置换(淘汰)掉 实现:维护一个FIFO队列,按照
2019-07-12
下一篇 
qmq消息队列-高可用 qmq消息队列-高可用
今天分享下qmq高可用的特性 高可用说明qmq高可用主要从两个角度提供: 分片:qmq不是基于partition,可以很容易通过添加更多的记起提高一个subject的可用性,消息按照一定的负载均衡策略分布在不同的机器上,某台机器离线后pr
2019-06-19
  目录