Mysql事务
Nevermore 2023-01-11 DataBase
MySql解决了对于数据库的并发修改问题,相应的策略称为事务。用户应用对应一个事务,会执行多条SQL语句,而Mysql保证执行多条SQL是具有原子性的,如果事务执行过程中发生错误会执行回滚,即撤销操作。数据的修改是永久的,即commit后数据具持久性,不再回滚。为了保证事务执行过程尽量不受其他事务干扰,具有隔离性。事务达到的目标是一致性,由用户和Mysql机制共同保证。
Mysql 只有使用InnoDB存储引擎才支持事务。对应查看show engine\G; --transaction字段
- 修改事务自动提交
若设为0,执行单条SQL时若一端崩溃,则会回滚。设为1,保证每条SQL都以事务方式进行自动提交。
show variables like 'autocommit';
1
set autocommit=1; -- set autocommit=0; --为命令行中单条SQL设置的,每条语句封装成事务
1
- 设置隔离级别
允许事务受不同级别的干扰。保证事务读写隔离的方式为read view快照和undo log。存在4种隔离级别:
- 读未提交 —— 读到了其他人未提交的数据,会造成本端对无效数据的读取(脏读),相当于没有隔离性,另一端可以同步查表更改情况
- 读提交 —— 只能看到已提交的事务数据,不可重复读(在不同的时间段读到了不同的数据),应用层在同一事务中可能会对同一信息进行多次的逻辑处理。
- 可重复读——Mysql默认,多次读取数据行相同。一事务修改(仅限修改update和删除)了表数据并且commit,但另一个事务的读取并不发生变化,除非结束当前事务再读取。对普通数据库来说,insert数据本不存在,不能加锁,造成多次查找出现新的记录,出现幻读,但MySql解决了幻读的问题(Next-key锁)。
- 串行化——强制事务排序,串行运行,不可并发。可同时读取,但是不能修改。
- session: 设置立即生效,仅当前会话
- global:所有端应重启
set [session | global] transaction isolation level [READ uncommitted | read committed | repeatable read | serializable];
1
select @@global.tx_isolation; --查看全局
select @@session.tx_isolation; --查看本次
select @@tx_isolation; --同session
1
2
3
2
3
- 启动事务
手动启动事务,和autocommit无关
start transaction; -- 或 begin;
1
- 保存
savepoint P1; --设置回滚点
1
- 回滚
rollback to P1; -- 前提是未被commit
rollback; --直接回滚到start位置
1
2
2
- 提交
commit; --不提交会自动回滚
1