什么是事务
要么都成功,要么都失败
将一组sql放在一个批次中执行~
数据库事务四个基本要素: ACID
原子性(Atomicity) : 原子性指的指的就是这个操作,要么全部成功,要么全部失败回滚。不存在其他的情况。
一致性(Consistency): 事务前后数据完整性一致,一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
举个例子。就是A和B的钱是1000元,A给你100元,无论最后双方转了多少次,总的钱一定是1000元。
隔离性(Isolation): 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性(Durability): 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 (如果事务没有提交则恢复到原状 ; 如果事务已经提交则持久化到数据库 , 一旦提交不可逆)
并发过程中可能会发生的问题 :
脏读 : 一个事务处理过程里读取了另一个未提交的事务中的数据。
举例 : A转账给B100元,然后还没有提交成功,这个时候,你用B用手机付款,这个事务读取到这个100了。然后就行了扣款,B读到的这个数据就是脏数据。因为A没有提交,可能会撤销。
不可重复读 : 指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。不可重复读一般是update操作
举例:比如A事务 读取了一个记录,然后此时B事务修改了这个记录会提交了,A事务再进行读取的时候就会跟之前的记录不一样。 会产生我们说的ABA问题。
幻读 : 幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。 幻读一般是insert操作
举例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读
执行事务
-- ============事务================
-- mysql是默认开启事务自动提交的
set autocommit = 0 -- 关闭自动提交
set autocommit = 1 -- 开启自动提交
-- 手动处理事务
set autocommit = 0 -- 关闭自动提交
-- 事务开启
start TRANSACTION -- 标记一个事务的开始从这个之后的sql都在一个事务内
-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
SAVEPOINT 保存点名 -- 设置一个事务保存点
rollback to savepoint 保存点名 -- 回滚到保存点
release savepoint 保存点名 -- 撤销保存点
-- 事务结束
set autocommit = 1 -- 开启自动提交
模拟转账: