1.什么是事务?
从书上看:事务可由一条非常简单的SQL语句,也可以有一组复杂的SQL语句组成。 简单说,事务就是SQL的集合。 也许你会问:事务就是SQL的集合吗? 那它有一个sql脚本有什么区别? 这里就涉及到事务的一个重要特性了:原子性。一个事务要么全部执行,要么全部不执行,不存在执行一部分,不执行一部分的情况,这就是它和sql脚本的区别,也就是说一个事务中的所有SQL,要么全部执行成功,要么全部执行失败。
注意:原子性是事务的根本!!
2.简单理解事务的ACID特性
ACID其实是四个特性首字母。 其中:
1)A: atomicity 原子性。
从上面可知,原子性就是不可分割的特性,也就是最小执行单位,它不可能再被分为很多小的过程。 那么事务的原子性又是什么呢? 简单来说,我们可以将一次事务当作一次考试。 当我们面对一次考试时,我们能做的选择有两个:参加,不参加。 参加代表着一次事务的开始(事务开始),当考试完毕,我们交了卷子(事务的提交),这次事务就视作结束。在参加考试的过程中,如果我们违反考试规则被老师抓住,我们的此次考试将被判无效,此前做的所有题的分数将被清0(事务回滚),这时如果我们想要得到考试分数,就只能重新参加考试(重新开始事务),但是如果我们做题的过程中有几道题不确定,我们可以给那几道题打个标记(保存点),然后再做剩下题的过程中灵光一现,知道咋做了,于是就回到那几道题上重新做(跳到保存点),然后往下做,做完试卷,到时间后交给老师,这次考试也就结束了。 不参加很简单,就是不开始这个事务。 参加考试要么有成绩,要么没成绩,不存在有一半成绩的情况,这就是事务的原子性。
2)C: consistency 一致性
什么是一致性? 书上的解释是:一致性指事务将数据库状态从一种状态转变为另一中一致性的状态。 我看到这句话的第一反应就是:看不懂! 但仔细思考后,我觉得通过一个实际的例子能更好的帮助理解: 一天,我和我的好朋友麻子在街上看到一个身材窈窕,气质极佳的美女,我和麻子相视一笑,我们都觉得这个美女是今天遇到的妹子中最养眼的一个,这时我们的看法是一致的。但走到下一个路口,我看到了更好看的妹子,而麻子兄弟因为看手机错过了,我认为第二个妹子是最养眼的,而麻子因为没看到第二个妹子,他还是认为第一个妹子是最养眼的,这时,我们的看法是不一致的。 现在转换到数据库上:我们不难理解,一致性就是当一个公共字段的值发生变化时,要保证所有看到这个值事务所看到的值是一致的,而不是有的事务看到了,有的事务没看到的情况。
3)I :isolation 隔离性
事务的隔离性,其实就是不同的事务对同一个表进行处理时,他们能彼此看到对方对这个表的操作吗? 读未提交:他们能看到彼此的操作。 读已提交:在事物的过程中,他们看不到彼此的操作,但当有一个事务提交后,另一个事务就可以看到了。 可重复读:他们看不到彼此的操作(即使另一个事务已经提交),但是他们也不会被彼此的操作影响自己的操作。 可串行化:他们的操作是串行化的,一个一个来的。
4)D: durability 持久性
事务的持久性就是当一次事务提交后,它保存的数据就是永久的,即使宕机,数据库也能恢复。
3.使用事务的好处
使用事务最大的好处就是,当我们在执行一串SQL时,突然发现中间一条SQL执行的结果是错误的,这时,我们就可以反悔,告诉数据库,前面的SQL失效吧。 这时数据库就会回滚前面已执行的SQL语句,我们又可以重新开始自己的SQL操作了,这避免了很多问题。 这在很多应用场景下都很有用: 比如银行系统的转账服务: A要向B账户转200块:首先检查A账户是否有200块,然后扣除A账户200,接着向B账户存入200,但是在存入的过程中发现B账户由于某种原因无法使用了,存入失败。 这时如果没有事务,那么就只能手工的往A账户加200块,但是有了事务,在B账户存入失败后,数据库会自动回滚前面A账户扣除200块的操作。这样大大提高了工作效率。
|