MySQL复习06-TCL事务控制语言

1.单个事务操作

1.1 禁用自动提交

// 当前事务禁用自动提交
set autocommit = 0;
start transaction;

1.2 事务使用范围

DML:insert, update, delete, select

1.3 事务提交

commit/rollback;

2.多个事务:事务隔离

2.1 隔离级别导致的错误

脏读:read uncommitted.
不可重复读:read committed.
幻读:repeatable read.
-- 序列化:serializable(不可能出错,性能极低,不可使用。)

2.2 隔离错误的演示

2.2.1 脏读- read uncommitted(读未提交)

set autocommit = 0;
// 设置当前事务隔离级别为最低,可出现脏读。
set session transaction isolation level read uncommitted;
// 任务1更新字段
// 另一个任务2也处于read uncommitted级别,select相应字段。
// 任务1执行回退,rollback.
// 任务2再次select,凉凉。
-- 结果:任务2同一次会话,两次相同数据查询,结果不一样。

2.2.2 不可重复读- read committed(读已提交)

// 同上进入相应隔离级别read committed.
// 会话1执行update
// 会话2select————————会话1没commit就不会读到,不会脏读。
// 会话1执行commit
// 会话2再次select数据与前一次不同。出现不可重复读。
-- 脏读是查找会被回退影响,不可重复读是事务2在事务1执行过程中读而受到影响。

2.2.3 幻读- repeatable read(可重复读)

// 同上进入相应隔离级别repeatable read
// 事务1先查询,打算修改2行记录。
// 事务2执行insert,正好满足事务1打算修改的条件。
// 事务1再次查询,发现准备修改3条。
-- 修改条数发生改变。

3.小结

1.mysql的innodb引擎默认隔离级别是repeatable read(可重复读),可以隔离的错误是读已提交,不能隔离幻读错误。
2.脏读是可以读没提交的数据,会让事务失去意义。
3.不可重复读是可以读提交后的数据,可能由于事件的交叉导致读取数据差错。
4.幻读可以读事务结束后的数据,在事务发生前后读取的数据不同。
5.序列化基本不使用,相当于单线程。这样就可以完全避免多任务并发的问题,但是本末倒置。

猜你喜欢

转载自blog.csdn.net/weixin_37627774/article/details/108586237