事务特征以及隔离级别,原生Java开发的路该怎么走


事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

举个栗子:假如A转账给B100元,第一步需要将A账户扣除100元,第二步需要将B账户增加100元,这两个操作组成了一个转账操作,假如我们在执行第一步的时候突然断电导致服务器宕机,这样就会造成A账户被扣除100元,B账户并没有相应的加钱操作,这是致命的问题,为了解决这个问题,事务就出现了,他表示第一步与第二步要么同时成功,要么同时失败,不会出现其他情况,这样就保证了转账的一致性。

这里我们设置一个转账的案例:A账户:100元;B账户:100元。

步骤:

1.开启事务

2.第二步:扣除A账户100元;

3.第三步:B账户增加100元;

4.第四步:提交事务。

事务是如何保证的呢?


这就要说到事务的几个特征:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),也就是常说的ACID特性。

原子性(atomicity):知道原子是什么吗?原子在化学反应中不可分割,也就是说原子是最小单位,一个事务必须被作为一个不可分割的最小工作单员,在一个事务中,所有操作要么同时成功,要么同时不执行,对于同一个事务,永远不能出现一个操作成功,另一个操作失败的情况,这就是事务的原子性。

**一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态,也就是说从一个状态改编成另一个状态,转账为例,初始状态A账户100元,

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

B账户0元,假设在执行了A账户的扣钱操作之后系统奔溃,导致状态的转换没有完成,因此事务不会提交,所以在数据库中数据也不会做出相应的修改。**

隔离性(isolation):这个是比较重要的一点,通常来说,一个事务在提交之前的所有操作是对其他事务不可见的,举个例子:A账户给B账户转账100元,执行了1、2步之后,突然线程被切换了,因为账号这时候账号B给账号A转50元,它查询A账户的结果还是100元,不会看到被扣除的结果,这就是事务的隔离性。

持久性(durability):这个比较好理解,就是说事务提交之后,事务中所作的所有操作都将永久保存到数据库中,就算系统奔溃,修改的数据也不会丢失。

事务的ACID特征保证了转账的准确性,不会导致金钱的丢失,但是,程序中真的要做到不丢失你的金钱是比较复杂的,所以这时候性能可能就不会那么出众了,因为程序、存储引擎会做大量的工作来保证事务的准确性。

就像锁一样,他保证了线程安全,但是降低了可用性,mysql的存储引擎有很多,有支持事务的也有不支持事务的,比如:InnoDB支持事务;MyISAM不支持事务。我们在选型的时候根据项目的需求来判断,对于一些不需要事务的查询类应用,选择MyISAM存储引擎可以获得更高的效率,如果个别操作需要事务,也可以通过lock tables语句来提供保护。

上一篇:Python 判断文件后缀


下一篇:Activity的启动流程三--基于API30分析