事务隔离

事务隔离

A (Atomicity)

原子性

C (Consistency)

一致性

I (Consistency)

隔离性

SQL 隔离级别

  • 读未提交

    • 一个事务还未提交,它做的变更就能被别的事务看到。
  • 读提交

    • 一个事务提交后,它做的变更才会被其它事务看到。
  • 可重复读

    • 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更时,对其它事务不可见。
  • 串行化

    • 对同一行记录,‘写’ 会加 ‘写锁’ ,‘读’ 会加 ‘读锁。当出现读写锁冲突,后访问的事务必须等待前一个事务执行完成,才能继续执行。

D (Consistency)

持久性

配置隔离级别:

将启动参数 transaction-isolation 的值设置为:READ-COMMITTED 。可以使用 show variables 查看当前值。

事务隔离的实现:

每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

回滚日志的删除:

当系统里没有比这个回滚日志更早的 read-view 的时候,日志就会被删除
长事务就可能导致它用到的回滚记录都必须保留,占用大量空间。
MySQL 5.5 及以前的版本,回滚日志是跟数据字典一起放在 ibdata 文件里的,即使长事务最终提交,回滚段被清理,文件也不会变小。

不同时刻启动的事务会有不同的 read-view,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)

事务启动方式

1.显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。

2.set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

概要: 建议使用这个,设置 set autocommit=1 ,通过显示语句的方式来启动事务

  • 在 autocommit 为 1 的情况下,用 begin 显式启动的事务

    • commit

      • 提交事务
    • commit work and chain

      • 提交事务并自动启动下一个事务
      • 节省再次执行 begin 语句的开销
  • 概要: 从程序开发的角度明确地知道每个语句是否处于事务中

概要: 在长连接中,可能导致意外的长事务

XMind: ZEN - Trial Version

Xmind 图

Larwas
请先登录后发表评论
  • 最新评论
  • 总共1条评论
Larwas

傲慢:好,很好,很不错的小伙子。

2018-12-03 10:57:34 回复