成功or失败?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 成功or失败?

不知道大家对事务了解多少?如果大家使用过数据库,使用过sql进行过查询语句的编写,那么对事务应该也有所耳闻吧,接下来就给大家讲解一下事务的相关内容(如果大家对数据库的相关概念还不是很熟悉的话,可以在后台留言,抽空阿Q会将其进行整理,一并分享给大家)。

首先是事务的概念:一件事情由n个组成单元,这n个组成单元要么同时成功,要么同时失败,这就是将n个组成单元放到一个事务中了。举个简单的例子:在不考虑试题正确与否的前提下,一张试卷由多个题目构成,当你答完题交给老师的时候是将一整张试卷交给老师,而不是将每道题单独交给老师,在这里试卷就可以理解成一个事务。

事务的操作一般分为开启事务、事务提交和事务回滚。让我们看一下平时见到的事务都有哪些。

mysql中的事务1)显示的开启一个事务:start transaction2)事务提交:commit代表从开启事务事务提交中间的所有的sql都认为有效,真正的更新数据3)事务的回滚:rollback 从开启事务事务回滚中间的所有的sql操作都认为无效数据,没有被更新

JDBC事务操作开启事务:conn.setAutoCommit(false);提交事务:conn.commit();回滚事务:conn.rollback();注意:执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制

DBUtils事务操作无参构造可以开启事务:QueryRunner runner = new QueryRunner();无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使用QueryRunner对象操作数据库时要使用有Connection参数的方法runner.update(conn,sql);

接下来就介绍一下事务的特性(ACID),这四个特性一般在面试题中会被问到,需要记忆一下:

1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作,要么都发生,要么都不发生;

eg:拿购物来说吧,假设你在购物车里添加了两件衣服:鞋子+裤子,当你把两件衣服作为一个订单提交支付的时候,要么两件衣服一起支付成功,要么都失败,不可能存在衣服付完钱了,鞋子还没付完的情况,反之亦然。

2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致;

eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是20000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是20000,这就是事务的一致性。

3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离;

eg:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

eg: 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

在许多事务处理同一个数据时,如果没有采取有效的隔离机制,那么并发处理数据时,会带来一些的问题。

隔离性引发并发问题1)脏读:B事务读取到了A事务尚未提交的数据;2)不可重复读:一个事务中两次读取的数据的内容不一致;3)幻读/虚读:一个事务中两次读取的数据的数量不一致;

事务的隔离级别1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的3)repeatable read:重读读取:可以解决脏读和不可重复读 ---mysql默认的4)serializable:串行化:可以解决脏读、不可重复读和虚读---相当于锁表(如有疑问想提前了解锁表机制,可以提问哟)

查看mysql数据库默认的隔离级别:select @@tx_isolation
设置mysql的隔离级别

例子:设置事务隔离级别+读未提交set session transaction isolation level read uncommitted;


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
iOS开发 MacOS
CocoaPods安装失败解决方法
CocoaPods安装失败解决方法
75 2
|
7月前
|
算法 C++
【算法】网络最大流问题,三次尝试以失败告终
开始 已多次看到“网络最大流问题”的字眼,一直不知道是什么,后来终于有一次打算仔细了解一下,期间我发现了一篇不错的博客:全面理解网络流中的最大流问题。在这篇博客的帮助下,我成功弄清楚了什么是网络流中的最大流问题,同时也明白了解决这个问题的基本思路。
100 0
|
安全 Dubbo 应用服务中间件
快速失败与失败安全简述
快速失败与失败安全简述
107 0
|
存储 消息中间件 缓存
消息列队有没有可能失败?在哪些环节可能失败,如何处理?
相信大家都使用过消息MQ,他可以很好地进行系统解耦,减低变成的复杂度,又可以进行削峰,增加系统在高并发的稳定性。那么使用MQ有哪些注意事项呢?是不是MQ就是万无一失呢?一条MQ消息从产生到消费,有没有可能失败?在哪些环节可能失败,如何处理? 一般来说,从生产者到MQ中间件是通过网络调用的,是网络调用就有可能存在失败。下面这些原因,都有可能造成MQ生产失败,例如网络波动,尽管生产者到MQ服务器之间是内网调用,并不意味着网络调用的成功率就是百分之百,内网调用也会遇到网络波动,造成调用超时或者失败。又如调用的MQ机器瞬间Crash掉,这也是有可能造成调用失败的。
消息列队有没有可能失败?在哪些环节可能失败,如何处理?
|
敏捷开发 运维 负载均衡
为什么IT项目仍然失败
为什么IT项目仍然失败
181 0
为什么IT项目仍然失败
|
Web App开发
抱歉,订单不存在,请检查后重试。
错误截图: 错误原因: 新版2.0接口推出时间是2016 -08 -10 ,如果你现在测试的接口是使用appid请求【如何判断自己使用的appid请求的】   并且您的高级快捷支付(无线),高级手机网站支付,即时到账这些接口是2016年8月10号之前签约的,请走下面方案    (重点)首先查看自己的签约详情【点击查看】主要看签约时间是否是2016年8月10号之前签约的。
754 12
|
Web App开发 PHP
guzzle调用失败-缺少guzzle
用composer安装了,但是目前为止还有问题。开发环境是 WAMP PHP5.4.12. 已经打开PHP.ini 的SSL扩展,现在还是提示缺少 curl-ca-bundle.cr 报错 No system CA bundle could be found in any of the the common system locations.
1071 0
|
SQL Windows
在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'
在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL Server服务启动账号域账号锁定的情况下,有些Job Owner为域账号的作业执行会报错...
1345 0