Fork me on GitHub

事务基础

事务(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

posted @ 2020-06-26 18:16  Faded828x  阅读(111)  评论(0编辑  收藏  举报