数据库--事务隔离

事务

​ 事务保证一组数据库操作要么全成功,要么全失败,mysql中事务在存储引擎层实现

​ 事务包含四个特性:ACID( 即原子性、一致性、隔离性、持久性)

事务隔离级别

​ 当数据库中多个事务同时执行可能出现脏读、不可重复读、幻读,而隔离级别的概念就是用于解决上述问题

​ 事务隔离级别包括: 读未提交、读提交、可重复读、串行化,隔离程度依次增强,效率依次降低,在mysql中通过show variables like 'transaction_isolation'查看当前引擎隔离级别

读未提交

​ 即事务没提交前做的变更,就能被其它事务看到,也就是说直接返回记录上的最新值,无视图概念

读已提交

​ 即事务做的变更提交后才能被其它事务看到,也就是说在每个sql语句开始执行时创建视图,Oracle默认隔离级别读已提交

可重复度

​ 相比读已提交,事务执行期间看到的数据前后一致,也就是说在事务启动时创建视图,mysql默认隔离级别为可重复度

可串行化

对同一行记录通过添加读写锁的方式避免并行访问

实现原理

​ 因为事务的操作要么全成功,要么全失败。失败后通过回滚日志来恢复原值

​ 在mysql中每条记录更新时都会同时记录回滚操作, 由于记录可以存在多个版本( MVCC,也就是数据库的多版本并发控制),因此不同时刻启动的事务可能有不同的read-view,他们回滚到的位置也不同

​ 当事务提交前,它可能用到的回滚记录都必须保留。

​ 一个事务操作越多(长事务),链表就越长,占用内存越多。除此之外长事务还占用锁资源,因此尽量避免使用长事务

启动事务方式

  • 通过begin 或 start transaction显式启动事务,提交 commit,回滚 rollback
  • 通过set autocommit=0关掉自动提交,这个事务持续存在直到执行 commit 或 rollback 语句或断开连接

避免长事务

从应用开发端看:

  1. 建议通过set autocommit=1打开自动提交单独对事务显示启动。对于频繁使用事务的业务,为了减少一次交互可采用commit work and chain(即提交并再次开启事务,由begin…commit;begin…commit变为begin…commit work and chain…commit)
  2. 确认是否有不必要的只读事务(对于多个select语句的只读事务可以去掉)
  3. 根据业务本身的预估,通过SET MAX_EXECUTION_TIME来控制每个语句执行的最长时间,避免单个语句意外执行太长时间

从数据库端看

  1. 监控information_schema.Innodb_trx表,设置长事务阈值,超过就报警或kill,比如通过select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60来查找时间超过60s的事务
  2. 推荐使用Percona 的 pt-kill 工具
  3. 在业务功能测试阶段要求输出所有的 general_log,分析日志行为提前发现问题
  4. innodb_undo_tablespaces设置成2或更大值(如果真出现回滚段过大,这样设置后清理起来更方便)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值