时间:2021-07-01 10:21:17 帮助过:5人阅读
基本操作 | 说明 |
start transaction; | 开始事务 |
commit; | 提交(全部完成) |
rollback; | 回滚(回到初始状态) |
图中便是数据库中的事务操作;及 开始事务-->SQL操作-->commit/rollback; savepoint,保存点,在事务回滚时,可以回滚到保存点; 而提交只能全部提交不能仅提交保存点;
savepoint savepoint_name; rollback to savepoint_name; commit;事务开始也可以用 begin;或者 start transaction; 清空表数据:
mysql> select * from ttt; +---+------+------+ | a | b | c | +---+------+------+ | 1 | 1 | 1 | +---+------+------+ 1 row in set (0.00 sec) mysql> truncate table ttt; Query OK, 0 rows affected (0.01 sec) mysql> select * from ttt; Empty set (0.00 sec)当多个连接同时连在一个数据库中时,truncate 命令无法使用 自动提交(默认开启)
mysql> show variables like ‘%autocommit%‘; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> set session autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like ‘%autocommit%‘; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+ 1 row in set (0.00 sec)此时,在这个session中将DML将不会自动提交; 而如果在DML语句后我们进行了一句 DDL语句: alter table ttt add new int(11);增加了一个字段;此时之前的DML也会自动提交, 因为DDL永远都会在语句后面自动COMMIT,而也顺带把之前的DML语句也提交了; 基本属性
机械硬盘对随机的读写非常慢,所以数据并不是同步刷新的。当update set a =3 ,commit ; 顺序写到事务日志中去,然后在空闲时,顺序的异步刷新到磁盘中去;这样速度回比较快, 因为机械硬盘对顺序读写操作的速度还是很快的。但如果数据库发现异常宕机了, 此时磁盘上的记录并没有得到修改,这时候需要通过回放事务日志的方式,也就是通过事务日志,重新将事务,更新到磁盘中去。 事务的隔离性 数据库事务在提交完成前,中间的任何数据变化对其他的事务都是不可见的。
隔离现象
mysql的事务隔离级别
tx_isolation 设置隔离级别; 数据库的隔离现象与隔离级别的演示
隔离现象
mysql> show global variables like "%iso%"; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+
修改隔离级别:
set global tx_isolation = ‘READ-COMMITTED ‘;
READ UNCOMMITTED (未提交读) 的 dirty read(脏读)现象: 脏读现象:即A连接,未提交的事务,B连接的事务可以看到; READ COMMITTED(已提交读)的NONREPEATABLE READ(不可重复读)现象: A连接,提交的事务,B连接的事务中可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态;PS:叫可重复读不是更贴切? 注意:不可重复读针对update,delete READ COMMITTED(已提交读)的PHANTOM READ(幻读)现象: A连接,提交的事务,B连接的事务可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态; 注意:幻读针对insert; REPEATABLE-READ(可重复读)的PHANTOM READ(幻读)现象: 但是在mysql中innodb事务引擎,将可重复读的幻读现象也消除掉了; 通过gap lock 间隙锁来 粗暴的实现 可重复读:即消除了不可重复读的现象; 事务与并发写
总结
mysql事务
标签: