mysql由浅入深探究(四)----mysql事务详解
- 什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作。解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操作。
- 事务的作用: 上面说了事务的定义,但不太能体现事务的重要性,其实事务是一个很重要的概念,我们经常会听到一些相关的名词: 回滚,隔离(当然这里只是说数据库的,其实这两个概念的含义更加广泛),这就是事务的作用。
-
- 回滚: 事务作为一个逻辑单元,具有回滚的作用。回滚就是说我们在进行处理事务的时候,我们能够对事务进行回滚,恢复到事务开始之前的状态。其本质是通过记录事务开始前状态来实现的,这个后面再说吧。
- 隔离: 隔离,顾名思义就是把这些逻辑单元给隔离起来,不让其他逻辑单元进行干扰。实际应用中我们会有多个线程同时对数据库进行操作,比如A在修改,B也在修改,如果不加以控制,很可能造成脏数据。
- 事务特性ACID:
-
- A: Atomicity原子性,怎么理解--就是只存在一个状态的性质,要么执行成功,要么执行失败,只可能是这两种情况,并且只能出现其中一种情况!
- C: Consistency一致性,一致性说的是数据库中的数据满足完整性约束。
- I: Isolation隔离性,隔离性的意思是同时存在两个事务的时候不能相互干扰。
- D: durability持久性,就是事务所做出的更改必须能持久化到硬盘,不至于轻易丢失。
-
- 上面已经介绍了事务的基本的性质,作用:扯了一堆理论知识,现在我们来点实战性的!!!
上面我们已经介绍了事务的概念,那么我们如何操作事务呢?操作的方式有很多,比如java中的jdbc,或者是shell都行!下面我们通过终端来学一下,首先我们应该知道一个概念叫自动提交,那么什么是自动提交呢?这个很好理解,就是在操作数据库时我们不必显示的进行事务提交,而由mysql自动替我们完成。
A. 查看mysql的提交方式:show variables like 'autocommit';能够查看数据库是否是自动提交的。
B. 设定mysql的自动提交方式: set autocommit=false;就可以设定mysql不自动提交了。
C. 自动提交pk手动提交:下面我们来试试自动提交和手动提交的差别:
-
-
- 自动提交:我们执行一条命令后我们就没有反悔的权利了!比如,银行的业务中,A向B转账100元,银行需要做的有两步,首先A银行卡中减去100元,B银行卡中增加100元,但是如果设置为自动提交,当第一步完成了银行服务器宕机了,那么完了,数据出现了问题。所以企业通常都会设置autocommit为false。
- 手动提交:
- 开启事务: 方式begin,start transaction,set autoCommit
- 提交事务: commit
- 回滚事务: rollback
- 事务实例: 举一个例子来说明事务:我们有这样一个员工表Baidu(name,age,salary);
-
下面我们对这个表进行操作,首先通过上述方法设置开启事务,插入一条数据,查看数据库,提交或者回滚(注意,这里我们在同一个终端进行操作,因为不同终端设计到事务的隔离性。我们下一节会学习)如下:
上面我们已经插入了一个记录,我们可以在本终端进行查看,我们在这个终端可以发现已经插入成功了,但是如果此时进行rollback操作,再查看就会发现插入的数据消失了。如果提交,那么数据将会被持久化到数据库中。
D. 事务的原理: 上面的操作我们会发现,在未提交时我们可以对事务进行回滚,那么我们需要知道为什么能进行回滚呢?实际上mysql是通过日志的方式来进行回滚的,我们在会对事务内的操作进行日志记录,如果发生回滚现象,mysql将会读取日志信息进行redo(将已经执行成功但是没有持久化到硬盘中的数据进行持久化),用这样的办法来保证一致性。然后再将事务中没有提交的部分进行Undo,用此方法来保证原子性。