事务
15.1 基础知识
mysql默认自动事务提交,事务面对增,删,改操作时的一种控制手段,当面对一次操作多条记录,或都多个连接同时操作一条记录时的统一性管理手段,控制的是,增,删,改操作是否有效
查看刚当mysql的自动事务提交:
show session variables like '%autocommit%'
自动事务提交代表着,当执行insert update delete语句时会决定结果立即发生变化
1、关闭自动事务提交
set @@autocommit=0;
2、开启一个新的事务
start transaction;
3、执行增,删,改操作
insert into student values(null,'123123','梅澳','男',3,'13312344333','重庆市',now(),null,null,null); update student set address='重庆市石桥铺',email='33333@qq.com' where studentNo=37;
4、根据情况决定是提交还是回滚
commit; 提交
rollback; 回滚
select ROW_COUNT(); ROW_COUNT();执行增,删,改操作的SQL语句时如果执行成功返回大于0的结果,执行失败返回0
银行转账案例:
代码语言:javascript复制set @@autocommit=0;
start transaction;
update mybank set bank=bank-500 where id=1;
select ROW_COUNT();
update mybank set bank=bank 500 where id=3;
select ROW_COUNT();
commit;
rollback;
##根据select ROW_COUNT();来判定是否要提交还是回滚
创建还原点:
savepoint 名称; 创建还原点
rollback to 还原点名称; 回滚到还原点上,原点以下的操作回滚,还原点以上的操作提交
案例:
代码语言:javascript复制start transaction;
insert into mybank values(null,'张三',100);
savepoint a1;
insert into mybank values(null,'李四',200);
savepoint a2;
insert into mybank values(null,'王五',300);
savepoint a3;
insert into mybank values(null,'朱六',400);
rollback to a2;
commit;
15.2 事务的基本要素
原子性(Atomicity):
事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
一致性(Consistency):
事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
隔离性(Isolation):
同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。(相当于多线程中的上锁)
持久性(Durability):
事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
15.3 并发问题
脏读:
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可以重复读
事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
幻读
事务A在一个事务中查询数据,第一次查询出现两条,同时事务B在添加数据并提交,事务A再次查询数据出现了3条,这时就叫幻读
15.4 隔离级别
REPEATABLE-READ 这是mysql默认的事务隔离级别
show session VARIABLES like '%tx_isolation%' 查看当前会话的事务隔离级别
set session TRANSACTION ISOLATION level read uncommitted; 修改当前会话的事务隔离级别为读未提交
案例:
事务 B对修改回滚以后,事务A又读取到以前的数据了,这就是脏读。
不可重复读就是在这个过程中把rollback变成了commit。事务A可以读取到事务B提交后的数据,这是不可重复读。
幻读就是事务B在添加后进行了commit,事务A多次读取的记录的数量不一致,这就是幻读。
set session TRANSACTION ISOLATION level repeatable read; 修改事务为默认级别,幻读已经解决。
set session TRANSACTION ISOLATION level read committed; 修改当前会话的事务隔离级别为不可重复读
set session TRANSACTION ISOLATION level serializable; 修改事务为串行化,效率低下