一、什么是事务
数据库中的概念,按我个人理解:能够保证一组任务全部执行成功或者全部执行失败的这么个机制,叫事务
事务是数据库中重要概念,如果没有这种保障机制,数据库中的数据就是不安全的(就是无法保证数据的正确性)
在数据库中,一组任务,就是放在一起执行的多条sql
二、ACID保证数据安全
所以如何才能保证数据安全呢?前人总结了如下四点
1.原子性,一组任务全部执行成功或者全部执行失败.这是基础,因为我们一组操作一般是有顺序的,有互相依赖关系的,要同步的,不能A表修改了,B表修改失败,这样数据就不同步了,也就是不正确了
2.一致性,就是我们的一组操作应该合辙(合乎逻辑,合乎道理),常见例子就是互相转账的例子:A转给C 10块,B转给C 20块 ,C最后手里一定要多 30块,这样就是保证了一致性,这样数据才正确
3.隔离性,隔离性在并发事务中才能体现作用,每个单独的事务要保证数据正确性,那么同时并发的多个单独的事务最后的结果,也应该保证最后数据正确
4.持久性,就是我们所做的操作必须被持久的保存下来,不能说事务正确的结束了,但是数据库没有被修改,这时数据也是不正确的.
所以保证数据正确性,就要保证数据开始是正确的,过程中每一步操作都是正确的(原子性,隔离性),最后结果是正确的(一致性),而且结果被正确的保留下来(持久性)
我们给这些特性总结了一个名字,叫事务,所以很多不理解事务的童鞋,可以不要去理解事务是什么,而应该反过来理解什么是事务(长成这样的就是事务)
要保证事务,需要理解的知识点如下:
两do一点:redo日志,undo日志,checkpoint
MVCC(ReadView)
事务隔离级别
savepoint
锁
MDL锁
这里我只是给自己留的随笔,所以不会详细讲解,但是会留入口
三、事务流程
大致分这么三条线
第一条红线:成功结果,事务正常执行,开启事务直到提交事务,刷新到硬盘上(只有进入硬盘才算持久化完毕,但并不是说数据要刷入硬盘,而是redo日志进入硬盘,即可保证持久性)
第二条橘线和第三条绿线:都是失败结果,原因可以是报异常,或者手动回滚数据,导致事务失败,完成回滚(使用undo日志回滚数据)
只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效(redo日志的作用),对于处于中止状态的事务,该事务对数据库所做的所有修改都会被回滚到没执行该事务之前的状态(undo日志的作用)。
四、事务的开启与提交与回滚操作
前提:数据库默认事务自动提交,所以默认每一条sql的执行都是一个单独的事务
涉及到的系统参数为autocommit ,ON和OFF
查看 show variables like 'autocommit'
修改 SET autocommit = OFF; -- 关闭自动提交事务
一般的,如果需要向数据库导入大量数据,由于sql执行默认单条sql为一次事务,如果有10条sql,就会分别开启事务提交事务10次,所以可以先关闭事务自动提交,自己手动开一次,执行sql,提交事务
1.开启事务:两种命令
BEGIN [WORK] (BEGIN 等价于 BEGIN WORK , 所以work可以写可以不写)
START TRANSACTION [READ ONLY | READ WRITE | WITH CONSISTENT SNAPSHOT];
两种语法区别:第二种可以指定事务是只读模式(事务中不能有写操作的sql),读写模式(事务中可读可写,默认的)和一致性读(一致性读,又称为快照读。使用的是MVCC机制读取undo中的已经提交的数据。所以它的读取是非阻塞的)
一致性读参看 https://www.cnblogs.com/digdeep/p/4947694.