一、事务操作的概念
1、概念 (银行转账,必须一方钱转出,另一方钱接收到了,才算完成事务)
在数据库中,事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
为确保数据库中数据的一致性,事务的操作应该是流畅完成的,中间不能失败,一旦有操作失败,那么回滚到开始事务的状态。
2、特点
原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。(数据不被破坏)
隔离性:一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对并发的事务也是隔离的。每一个事务都存在一个事务空间,彼此不干扰。
持久性:一个事务一旦被提交,它对数据库的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
二、事务的操作
--事务操作
--创建表
create table account(
id int unsigned not NULL primary key,
name varchar(20),
money int
);
--插入数据
insert into account values(1001,"张三",2000),(1002,"李四",5000),(1003,"王五",1000);
--李四给王五转500
update account set money = money - 500 where id = 1002;
--停电了,再次登录,数据出错,一个人少500,另一个人没增加
--update account set money = money + 500 where id = 1003;
--开启事务(需要同时执行的数据)
start transaction;
--李四给王五转500
update account set money = money - 500 where id = 1002;
--查询数据
select * from account; --李四少了500 看到的结果经过了事务日志 实际上没有修改
--王五要增加500
update account set money = money + 500 where id = 1003; --还是在缓存中
--退出数据库,再次登录,数据并没有被修改
--提交 数据库被真正修改
commit;
--回滚点(在重要的执行完成命令前添加回滚点,防止后续命令出错)
--开启事务
start transaction;
--张三转出500
update account set money = money - 500 where id = 1001;
--回滚点设定张三转出后的点
savepoint sp1;
--李四转出500
update account set money = money - 500 where id = 1002;
--回滚点设定李四转出后的点
savepoint sp2;
--王五增加1000
update account set money = money + 500 where id = 1003; --只增加了500,要撤回
--回滚到sp2
rollback to sp2;
--王五增加1000
update account set money = money + 1000 where id = 1003;
--提交事务
commit;
禁止自动提交:set autocommit=0
开启自动提交:set autocommit=1