一:事务的概念:
“事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败.在不同的环境中,都可以有事物,对应在数据库中就是数据库事物。
二:事物的使用:
(1)开启事物: start transaction
(2)执行多条SQL语句
(3)回滚或提交: rollback/commit
注:rollback即是全部失败,commit即是全部成功
事务把多个sql打包到一起,作为一个整体来执行,这样的特点成为”原子性“。
三:事务的意义所在:
为何要使用事务呢?这里我们举一个例子。比如小的时候还没有微信和支付宝,那个时候只能通过银行转账来打钱,比如小明的爸爸要给小明打钱,当小明爸爸去银行给小明转钱时,小明爸爸的账户余额减去了500,而小明的账户余额没有增加500,那这个时候小明的爸爸就需要找银行柜台去处理此事,MySQL中为了避免这种事情的发生就引入了”事务“,这里可以解释为:将小明爸爸的账户余额减去500与小明的账户余额增加500打包为一个事务,如果小明爸爸的账户余额减去了500,而小明的账户余额没有增加500,那么直接回滚,即全部失败也就不用担心转错账户了,这便是事务的意义所在。
注:rollback一般是要搭配一些条件判断逻辑来使用的,SQL也能支持例如条件、循环、变量、函数.......(但是日常开发一般不会这么写),更多的是搭配其他的编程语言。
四:rollback回滚如何完成:
rollback回滚是通过日志的方式,记录事务中的关键操作,这样的记录就是回滚的依据。
注:日志一般是打印出来的内容,一般在文件里,即使是主机掉电,也不影响(回滚用的日志已经在文件中了)一旦重新启动主机,mysql也重新启动,就会发现回滚日志中有一些需要进行回滚的操作.于是就可以完成这里的回滚了。
五:事务的各个特性:
事务不仅仅有原子性特性,还有一些其他方面的特性.
(1)原子性:通过回滚的方式,保证这一系列操作,都能执行正确,或者恢复如初。
(2)一致性:事务执行之前和之后,数据都不能离谱,很多时候是要靠数据库的约束以及一系列检查机制来完成的。
(3)持久性:事务做出的修改,都是在硬盘上持久保存的。
(4)隔离性:(数据库并发执行多个事务的时候,涉及到的问题)隔离级别,就是在"数据正确"和效率"之间做权衡。
六:并发执行数据事物时可能会出现的问题
(1)脏读问题
一个事务A正在写数据的过程中,另一个物务B读取了同一个数据,接下来事物A又修改了数据,导致事务B之前读到的数据,是一个无效的数据/过时的数据(也称脏数据)
解决问题:解决脏读问题的核心思路为针对写操作上锁(写完之前不让读)
(2)不可重复读问题
并发执行事务过程中,如果事务A在内部多次读取同一个数据的时候,出现不同的情况,这种就是不可重复读。事务A在两次读取之间,有一个事务B修改了数据并提交了事务.
解决问题:解决不可重复读,需要给读操作加锁-(事务B读的时候,事务A也不能写)
(3)幻读问题
一个事物A执行过程中,两次的读取操作数据内容虽然没改变,但是结果集变了,这种称为幻续
解决问题:引入串行化的方式,解决幻读,保持绝对的串行执行事物
注:不同的业务场景中.关注的点是不同的.使用数据库也一样,有的时候希望效率最高,有的时候希望准确性最高。
mysql提供了"隔离级别"概念.可以直接在mysql配置文件中修改数据库的隔度级别.
七:四种隔离级别
四种隔高级别,对应到上述的三个问题
read uncommitted(读未提交):并发程度最高,速度最快.隔离性最低,准确性最低。
read committed(读已提交):引入了写加锁,只能读取写完之后提交的版本,并发程度降低了,速度 降低了,隔离性提高了,准确性提高了。
repeatable read(可重复读):引入了写加锁和读加锁,写的时候不能读,读的时候也不能写。并发 程度进一步降低了,速度降低了,隔离性提高了,准确性也提高了。
serializable(串行化):严格的按照串行的方式,一个一个的执行事务。并发程度最低(没有并发),速 度最低,隔高性最高,准确性最高。