mysql事务

事务

分类

  • 原子性 Atomicity
  • 一致性 Consistency
  • 隔离性 Isolation
  • 持久性 Durability

隔离性

隔离别

  • 读未提交 read uncommitted
    一个事务还未提交,他所做的变更就可以被别的事务看到。
  • 读提交 read committed
    一个事务提交以后,他所做的变更就可以被别的事务看到
  • 可重复读 repeatable read
    一个事务执行过程中看到的数据是一致的。未提交的更改对其它事务不可见。
  • 串行化 serializable
    对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完才能继续执行。

配置方法

  1. show variables like ‘transaction_isolation’,查看当前隔离级别
  2. set transaction_isolation=‘xxx’, 设置隔离级别。

事务隔离的实现

MVCC 多版本并发控制
每条记录在更新的时候,都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本。这就是mvcc。

回滚日志

系统自动判断当没有事务需要用到这些回滚日志时,就会删除。
当最老的视图read-view都没有用到这些回滚日志时,就删除。

避免长事务

  1. 长事务里会存在很老的视图,占用大量的空间。
  2. 长事务可能占用锁资源,拖垮整个库。

事务启动方式

  1. 设置自动提交 set autocommit=1
  2. begin / start transaction 开始 commit / rollback结束
  3. commit work and chain 结束并开始。

监控长事务

information_schema.innodb_trx表里有长事务的记录,通过监控此表,及时发现长事务。
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(), trx_started))>60;

应用开发端

  1. 确认是否使用了set autocommit=0, 将其改为1.通过general_log日志来确认。
  2. 只读事务可以不放到begin/commit中
  3. 通过set max_execution_time来控制每个语句的最长执行时间。

数据库端

  1. 监控information_schema.innodb_trx,设置长事务阙值,超过就报警,或者kill
  2. Percona 的pt-kill工具。
  3. 在业务功能测试阶段,要求输出所有的general_log,分析日志行为,提前发现问题。
  4. MySQL5.6之后,把innodb_undo_tablespaces设置成2.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值