事务基础
事务(transaction)
事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。例如银行转账交易,input和output的两条dml语句必须同时完成或失败。
特性:ACID(酸)
原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行
一致性(Consistency):一个事务执行命令使数据从一个一致状态切换成另外一个一致状态
隔离性(Isolation):一个事务的执行不受其他事务的干扰
持久性(Durability):一个事务一旦提交,则会永久的改变数据库的数据
数据库的并发问题:
脏读:对于两个事务T1、T2,T1读取了意境被T2更新但还没有提交的字段。之后,若T2回滚,则T1读取的内容是临时且无效的。(类似区块链中的分叉攻击,未提交指没有确认六个区块)
不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段(已提交)。T1再次读会得到不同值。
幻读:对于两个事务T1、T2,T1从表中读取字段,然后T2在表中插入新行。T1再次读取会多出几行。
隔离级别:
(解决)--> | 脏读 | 不可重复读 | 幻读 |
read uncommitted | × | × | × |
read committed | √ | × | × |
repeatable read | √ | √ | × |
√ | √ | √ |
查看mysql8默认隔离级别:
select @@transaction_isolation; +-------------------------+ | @@transaction_isolation | +-------------------------+ | REPEATABLE-READ | +-------------------------+ 1 row in set (0.00 sec)
更改隔离级别:
set autocommit=false;
set global transaction isolation level read committed;
global更改所有连接的隔离级别,单个连接则改为session。一个cmd窗口为一个连接:Your MySQL connection id is 8