事务的特性
- 一条或多条SQ语句组成一个执行单位,要么全执行,要么全不执行
特点
- A原子性:一个事务是一个不可分割的整体,要么全部执行,要么都不执行
- C一致性:一个事务使数据从一个一直状态到另一个一致状态
- I 隔离性:一个事务的执行不受其他事务的干扰,多个事务之间相互隔离
- D持久性:一个事务一旦提交,则永久的持续化到本地
分类
- 隐式事务:没有明显的开始和结束,本身就是一条事务可以自动提交,比如
insert、update、delete
- 显式事务:具有明显的开始和结束
事务的创建
- 事务提交前
- set autocommit= 0;
- start transaction; //可以省略
- 执行事务语句
- 语句1;
- 语句2;
- 设置回滚点
savepoint 回滚点名
- … …
- 事务提交或回滚
- commit 提交
- rollback 回滚
数据库隔离级别
各种并发问题
- 脏读:对于两个事务t1、t2,t1读取了已经被t2
更新
但还没有提交的字段,之后若t2进行回滚,t1读取的内容就是临时无效的 - 不可重复读:对于两个事务t1、t2,t1读取了一个字段,然后t2更新了该字段之后,t1再次读取时读到的就不是同一个值了
- 幻读:对于两个事务t1、t2,t1从一个表中读取了一个字段,然后t2在该表中
插入/删除
了一些新的行,之后如果t1再次读取同一个表,就会多出几行
隔离级别
- 定义:一个事务与其他事务隔离的程度
- 常用命令
- 查看当前隔离级别:
SELECT @@tx_isolation;
- 设置隔离级别:
set 【session|global】 transaction isolation level [read uncommit | read commit | repeatable read | serializable];
- 查看当前隔离级别:
- 分类
- read uncommitted:允许事务读取其他事务未提交的数据,可能出现脏读、幻读、不可重复读
- read committed:只允许事务读取已经提交的变更,可以避免脏读,可能会发生不可重复读和幻读
- repeatable read:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是可能出现幻读(MySQL中默认的隔离级别)
- serializable:确保事务可以从一个表读取相同的行,在这个事务持续期间,禁止其他事务对该表执行增删改操作,所有并发问题都可以避免,但是性能十分低下
- 隔离级别和对应并发问题
事务隔离基本 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | 是 | 是 | 是 |
read committed | 否 | 是 | 是 |
repeated read | 否 | 否 | 是 |
serializable | 否 | 否 | 否 |
delete和truncate在事务使用时的区别
- delete:支持回滚
- truncate:不支持回滚
版权声明:本文为double_happiness原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。