事务
1. 概念
- 一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
- TCL:Transaction Control Language 事务控制语言
1
2
3
4
5
6
7案例:转账
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name='张三丰'
意外
update 表 set 郭襄的余额=1500 where name='郭襄'2. 事物的特性(ACID)
- 原子性:一个事务不可再分割,要么都执行要么都不执行
- 一致性:一个事务执行的会使数据从一个一致状态切换到另一个一致状态
- 隔离性:一个事物的执行,不受其他事物的影响
- 持久性:一个事务一旦提交,则会永久的改变数据库的数据
3. 事物的创建
隐式事务:事务没有明显开启和结束的标记,比如insert,update,delete语句,一个命令就是一个事务显示事务:事务具有明显的开启和结束的标记1
DELETE FROM 表 WHERE id = 1;
前提:必须先设置自动提交功能为禁用步骤1:开启事务1
set autocommit=0;
步骤2:编写事务中的sql语句(select insert update delete)1
2set autocommit=0;
start transaction;步骤3:结束事务1
2
3语句1;
语句2;
...1
2
3commit;# 提交事务
rollback;# 回滚事务
savepoint 节点名;# 设置保存点5. 数据库的隔离级别
- 对于同时运行的多个事务,当这些事务访问数据库中的相同数据时,如果没有采取必要的隔离措施,就会导致各种并发问题
- 脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。
- 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
- 幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。
- 数据库事务的隔离性:数据库系统必须具有并发运行各事务的能力,使它们之间不会相会影响,避免发生各种并发问题。
- 数据库隔离级别:一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事物的隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性弱,效率低。
事物的级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
mysql中默认 第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed
1 | 查看隔离级别 |
7. 演示事务的使用步骤
1 | # 开启事务 |
1 | #3.演示savepoint 的使用 |