1.概念: 事务就是一个或者多个sql语句组成的单元,在这个单元中,每个sql都是相互依赖的。通俗地讲事务就是一个整体,里面的内容要么全部执行成功,要么都不成功,不可能存在部分执行成功的情况。如果执行某一条sql语句出现异常时,整个事务将会执行回滚整个事务会回到最初的状态。
2.重点:
sql要么不执行,要么全部执行成功,执行成功,提交事务。一旦事务中产生了错误,执行回滚,将数据还原到事务开启时的状态
3.事务的四大特征(ACID):
(1)原子性:每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功,要么都失败。
(2)一致性:事务在执行前数据库的状态与执行后数据库的状态保持一。
(3)隔离性(Isolation):事务与事务之间不应该相互影响,执行时保持隔离的状态。
(4)持久性(Durability):一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。
4.事务的隔离级别
当多个事务同时操作一张表时,会出现各种并发问题。并且在不同的事务隔离级别下出现不同的并发问题。
(1)更新丢失:当事务A和事务B在操作同一个值1000时,事务A把该值更新成了800了,而此时事务B读取的值还是1000,事务B在1000的基础上进行更新,而不是在800的基础上进行更新。
(2)脏读:事务A把值1000更新成了800,但还没有提交。事务B此时去读取改值时,读取到了800而不是1000。事务B读取到了事务A还没有提交的数据。
(3)不可重复读:一个事务将数据进行查询,在第二次查询期间,另一个事务对数据进行了修改,导致第二次查询的结果不再重复。
(4)幻读:一个事务对全部数据进行了修改,同时另一个事务添加了一条数据。第一次操作的事务查看数据时,发现有一条没有修改的数据,以为产生了幻觉。
#一、事务成功提交
-- 开启事务 start transaction/begin
start transaction;
#张三给李四转200
-- 张三转出200
update account set money=money-200 where
name="张三";
-- 李四转入200
update account set money=money+200 where
name="李四";
-- 提交事务,此时将SQL提交,表中数据才真正被改变
commit;
#二、事务的回滚
start transaction;
#张三给李四转200
-- 张三转出200
update account set money=money-200 where
name="张三";
-- 李四转入200,此时该操作错误
update account saaet money=money+200 where
name="李四";
select * from account;
-- 执行回滚,将数据回滚到开启事务时的状态,同时提交事务,此时不会对表数据进行影响
rollback;
#三、事务的回滚点
start transaction;
-- 张三转账3次100
update account set money=money-100 where
name="张三";
update account set money=money-100 where
name="张三";
update account set money=money-100 where
name="张三";
#设置回滚点
savepoint test;
-- 张三转账3次100
update account set money=money-100 where
name="张三";
update account set money=money-100 where
name="张三";
update account set money=money-100 where
name="张三";
# 回滚到指定的回滚点,不会自动提交事务
rollback to test;
commit;