事务的骚操作

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

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

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

mysql中的事务
1)显示的开启一个事务:start transaction
2)事务提交: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;

好了以上就是今天的内容了,想了解更多学习知识,请关注微信公众号“阿Q说”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Seata是一种高性能、高可靠性的开源分布式事务解决方案,它提供了对微服务架构下的分布式事务管理的支持。Seata的设计目标是提供一种简单、易于使用的分布式事务解决方案,同时还具有高性能和高可靠性。 在Seata中,每个分布式事务被称为一个全局事务,全局事务包含多个本地事务。全局事务由一个事务协调器(Transaction Coordinator)和多个事务参与者(Transaction Participant)组成。当一个全局事务需要跨越多个服务进行操作时,Seata会将全局事务进行拆分,每个服务对应一个事务参与者,这些事务参与者通过与事务协调器进行交互,最终协调完成全局事务的提交或回滚。 在Seata中,全局事务的状态包括三种:开始(BEGIN)、提交(COMMIT)和回滚(ROLLBACK)。当一个全局事务开始时,事务协调器会生成一个全局事务ID,并将该ID发送给所有的事务参与者。在全局事务执行的过程中,每个本地事务的状态都会被记录下来,并且在某个时刻,事务协调器会根据这些状态来决定是提交还是回滚全局事务。 当一个全局事务提交时,事务协调器会向所有事务参与者发送提交请求,并等待所有参与者返回提交结果。如果所有参与者都返回了成功的提交结果,那么事务协调器将最终提交该全局事务。如果有任何一个参与者返回了失败的提交结果,那么事务协调器将回滚该全局事务。 当一个全局事务回滚时,事务协调器会向所有事务参与者发送回滚请求,并等待所有参与者返回回滚结果。如果所有参与者都返回了成功的回滚结果,那么事务协调器将最终回滚该全局事务。如果有任何一个参与者返回了失败的回滚结果,那么事务协调器将强制回滚该全局事务。 总之,Seata通过事务协调器和事务参与者的协作,实现了分布式事务的管理和控制,提高了分布式系统的可靠性和一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿Q说代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值