博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 事务
阅读量:2419 次
发布时间:2019-05-10

本文共 1673 字,大约阅读时间需要 5 分钟。

目录

 

事务简介

有时候一个业务需要多次操作数据库,比如转账

在这里插入图片描述
如果reduce()执行成功,add执行失败,那钱是转出去了,但对方并没有收到,钱转丢了,应该加事务。

事务:逻辑上的一组操作,要么全部成功,要么全部失败。

 

事务的4个特性

  • 原子性(A):事务是执行数据库操作的最小单元(默认一个sql语句就是一个事务),一个事务中的操作,要么全部成功,要么全部失败
  • 一致性(C):事务执行前后,数据库中的数据应该保持一致。比如说A转账给B,转账前两人账户加起来一共有5W元,转账后两人账户加起来也应该是5W元。
  • 隔离性(I):事务之间应该是隔离的,一个事务的执行不应该受到其它事务的干扰、影响
  • 持久性(D):事务一旦提交,便会将修改持久化到数据库

 

事务的并发执行

如果没实现隔离性,事务并发执行时可能会出现以下问题

  • 读问题:脏读、不可重复读、虚读(幻读)
  • 写问题:丢失更新

 

示例  B取款的同时,A转账给B
在这里插入图片描述
虽然2个事务是并发执行的,但实际执行具体语句时仍有先后顺序。

 

脏读

一个事务读取到另一个事务未提交的数据。

eg. 事务A读取到事务B未提交的数据,事务B执行失败回滚,事务A之前读到的数据变成无效数据,但事务A并不知道这是无效数据,用这些数据来操作。

隔离级别 Read commited 已提交读,可解决脏读问题,等到使用这些记录的事务提交后才读取数据。

 

不可重复读

前后多次读取,读取到的数据内容不一致(期间已被其它事务使用update修改)。

eg. 事务A持续时间长,需要多次从数据库读取数据,但期间其它事务对数据库中的这部分数据进行了修改,事务A前后读取的数据对不上,前后执行的操作也就有误。

隔离级别 Repeatable read 重复读,可解决不可重复读的问题,当有事务读了某些行的数据后,这些行会被锁住,不允许其它事务对这些行进行修改,这样重复读取到的数据就是一致的。

因为使用某些行时,这些行会被锁定,其它事务不能读取这些行,也避免了脏读问题。

 

虚读(幻读)

前后多次读取,读取到的记录数不一致(期间其它事务使用insert、delete造成记录数变化)。

隔离级别 Serializable 可解决幻读问题,不允许事务并发,最安全,但性能最差,基本不用。

 

丢失更新

丢失更新是不可重复读中的一种特殊情况,2个事务都要修改记录内容(update),后提交的覆盖了前面提交的

 

事务的隔离级别

可通过设置事务的隔离级别,来解决读问题。

事务的4种隔离级别

  • Read uncommitted:未提交读,解决不了任何读问题,安全性最低,但事务执行效率最高
  • Read committed:已提交读,解决了脏读,但不可重复读、虚读有可能发生
  • Repeatable read:重复度,解决了脏读、不可重复读,但虚读有可能发生
  • Serializable:不允许事务并发,安全性最高,但事务执行效率最低

一般折中使用第2、3项,mysql默认用Repeatable read,oracle默认用Read committed,使用默认的即可。

 

数据库自身提供了4种事务隔离级别,spring还提供一种:

  • DEFAULT 使用数据库本身默认的隔离级别

 

事务的传播行为

事务管理是添加在业务层的,如果service层的方法发生相互调用

public void a(){
//.... b(); //....}

被调b()可能添加了事务,如果要给主调a()添加事务,如何添加?

事务的传播行为:service层发生方法的相互调用时,如何处理给主调方法加的事务

spring中定义了7种事务传播行为,默认使用REQUIRED,这个也是最常用的。

 

使用事务

事务是针对多个数据库操作的(dao层),dao层在service层调用,所以事务要加到service层的方法上。

mybatis的依赖中已经包含了事务管理,不需要额外导包,要对service层的某些业务方法使用事务,直接在方法上标注 @Transactional 即可。

转载地址:http://dzhlb.baihongyu.com/

你可能感兴趣的文章
【转】Docker Volume 之权限管理-Docker运行gogs容器时使用-v参数映射本地目录-报权限错误的原因及解决办法
查看>>
【转】Docker 运行时资源限制-内存memory、交换机分区Swap、CPU
查看>>
【转】etcd 启用 https-如何搞定证书、秘钥、SSL、TSL加密等问题
查看>>
Rancher的管理员密码忘记怎么办?-登录RancherServer的mysql容器内,修改cattle库setting表中2个关于访问控制的字段的值
查看>>
K8S客户端Kubectl无法下载问题的解决办法-到中科大USTC下载
查看>>
Docker相关的网络问题-软件源和镜像加速器
查看>>
Rancher中的容器如何使用固定的IP地址?-使用io.rancher.container.requested_ip标签
查看>>
如何批量删除Docker中已停止的容器?-可以有多种方式
查看>>
使用RancherServer:v1.6.12部署K8S-v1.8.3
查看>>
单节点Rancher Server v1.6.10版升级到v1.6.12版实验(上)
查看>>
Rancher Server HA的高可用部署实验-学习笔记
查看>>
Ubuntu APT命令使用手册
查看>>
【转】Rancher Pipeline发布:开源、极简、强大的CI/CD
查看>>
【笔记】《由浅入深SCF无服务器云函数实践》
查看>>
CentOS7设置GRUB系统内核开机选单
查看>>
CentOS7 升级内核及注意事项
查看>>
CentOS7中Docker v1.12.6的卸载和安装
查看>>
CentOS7中Docker-ce的卸载和安装
查看>>
开源镜像站点并非百分之百可靠
查看>>
CentOS7安装docker-ce-17.03.2时的问题及解决办法
查看>>