MySQL事务

fyh 2022年02月28日 43次浏览

什么是事务

要么都成功,要么都失败!
核心:将一组SQL放在一个批次去执行。

事务原则:ACID原则。原子性,一致性,隔离性,持久性。(脏读,幻读)

原子性(atomicity):
要么都成功,要么都失败
一致性(consistent):
事务前后的数据完整性要保证一致
隔离性(isolation):
多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务的操作数据所干扰,事务之间要相互隔离
四种隔离级别:

  • 未提交读 read-uncommitted
  • 已提交读 read-committed
  • 可重复读 repeatable-read
  • 可串行化 serializable

持久性(durable):
事务一旦提交则不可逆,被持久化到数据库中

隔离所导致的一些问题

脏读:
一个事务读取了另外一个事务未提交的数据
不可重复读:
在一个事务内读取表的某一行数据,多次读取的结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

-- 查询事务策略类型:
show variables like '%iso%'
-- 事务隔离级别的variable_name是tx_isolation;
-- 修改语句为 set session tx_isolation+'read-committed';

-- mysql是默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启

-- 手动处理事务

-- 开启一个新事务:begin;
-- 提交事务 commit;

-- 事务开启
SET autocommit = 0 -- 关闭
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内

...
...

-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK

-- 事务结束
SET autocommit = 1 -- 开启

-- 了解
SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE TO SAVEPOINT 保存点名 -- 撤销保存点

什么是大事务

定义:运行时间比较长,操作的数据比较多的事务
风险:锁定太多的数据,造成大量的阻塞和锁超时,回滚需要的时间比较长,执行时间长,容易造成主从延迟

如何处理大事务

1.避免一次处理太多的数据
2.移出不必要在事务中的SELECT操作