事务基本概念
- 事务是最小的一个工作单元, 在数据库当中, 事务表示一件完整的事
- 一个业务的完成可能需要多条DML语句共同配合才能完成, 例如转账业务, 需要执行两条DML语句, 先更新张三的业务, 再更新李四的业务, 为了保证转账业务不出现问题, 就必须保证这两条DML语句必须同时成功或者同时失败, 所以我们就需要借助业务这一机制来完成
- 也就是说使用了事务机制之后, 在同一个事务内部, 多条DML语句会同时成功或者同时失败, 不会出现一部分成功一部分失败的现象
- 事务只针对DML语句(insert, delete, update)有效, 因为只有这三个语句是改变表中数据的
- 事务只针对DML语句有效, 但是在一个事务内部是可以有DQL语句进行结果查询的
事务四大特性(ACID)
- 原子性(Atomicity)
是指事务包含的所有操作要么全部成功,要么同时失败 - 一致性(Consistency)
是指事务开始前,和事务完成后,数据应该是一致的。例如张三和李四的钱加起来是5000,中间不管进行过多少次的转账 操作(update),总量5000是不会变的。这就是事务的一致性。 - 隔离性(Isolation)
隔离性是当多个⽤户并发访问数据库时,⽐如操作同⼀张表时,数据库为每⼀个⽤户开启的事务,不能被其他事务的操作所⼲扰,多个并发事务之间要相互隔离, 隔离性主要解决的是多个事务并发的情况, 这在下面的内容里很重要 - 持久性(Durability)
持久性是指⼀个事务⼀旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
演示MySQL事务
手动开启事务
在dos命令行窗口的基本操作指令
事务操作 | 基本指令 |
---|---|
开启事务 | start transaction / begin |
提交事务(成功提交事务) | commit |
回滚事务(未成功提交事务) | rollback |
只要执行上面的commit或者是rollback事务都会结束, 前者是成功提交操作(即所有的操作都生效), 后者是回滚(未成功提交)撤销事务中的所有操作
演示如下
首先是查找一下t_student表中的数据
现在我们开启事务并执行一些DML操作后commit(成功提交)
我们发现成功插入了一条数据
现在我们再次开启一个事务并执行一些DML操作后rollback(未成功提交)
此时我们的stu_no = 13的这行记录并没有被删除…
MySQL默认事务机制
关于MySQL默认的事务机制:
MySQL默认情况下采用的事务机制是 : 自动提交, 所谓自动提交就是只要执行一条DML语句, 就会自动的开启事务并且执行结束之后直接commit, 所以这时候我们rollback是无法进行回滚的…(ACID中的持久性)
测试如下
分析一下底层的运行机制, 当执行insert语句的时候, 底层自动开启了事务机制, 这条SQL执行结束之后默认进行commit操作, 所以此时rollback并不能使之前的事务回滚