12、事务 ( 重点 )

transaction 单词本意:一笔交易、业务

comment 提交  rollback 回滚

 

一  什么是事务

事务是一个完整的业务逻辑单元,不可再分。

比如银行转账:从张三向李四转账1000元 需要执行两条 update 语句

1、update money set balance = balance-1000 where name='张三';

2、update money set balance = balance+1000 where name= '李四';

 以上两条DML 语句必须同时成功,或者同时失败,不允许一条成功,一条失败。

想要保证以上两条DML 语句同时成功或者失败,就需要用到数据库的 事务机制

 

二 知识点:

1、事务的存在是为了保障数据的完整性、安全性。

2、事务是一个业务,需要多条DML语句共同完成。

3、和事务相关的语句只有DML语句。因为DML是操作表中的数据的。

4、一条DML语句可以完成的业务,是不需要事务的。

 

三  事务的原理

转账:两条update语句,都成功才是完成

先开启事务 (事务开始)

执行update1,执行成功后,把执行的操作记录到缓存中,并没有改变硬盘上的数据文件

执行update2,执行成功后,也把执行的操作记录到缓存中,也没有动硬盘上的文件

提交事务 或 回滚事务。(提交或回滚都会结束事务)

提交:把缓存中的操作记录执行并删除记录,改变硬盘上的文件。

回滚:把缓存中的操作记录删除。

 

 

 

四  事务的四个特性 ACID

A:原子性:事务是最小的工作单元,不可再分。
C:一致性:事务必须保证多条DML语句同时成功或者同时失败。
I:隔离性:事务A与事务B之间具有隔离。
D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

 

五  事务的隔离性

事务隔离性存在隔离级别,理论上隔离级别包括4个:

1、读 未提交(read uncommitted)

对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。

读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
2、读 已提交(read committed)
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了
: 脏读现象没有了。
读已提交存在的问题是:不可重复读。
3、可 重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。
4、序列化读/串行化读(serializable) 
解决了所有问题。
效率低。需要事务排队。

Oracle默认:读已提交(第二级别)。

Mysql 默认:可重复读(第三级别)

 

六 实例演示

mysql事务默认情况下是自动提交的。

什么是自动提交:只要任意执行一条DML语句就提交一次。

如何关闭呢:start transaction(开始事务 就是关闭mysql的自动提交

//1 准备表 引擎用innodb
drop table if exists user; create table user(id int primary key auto_increment,name varchar(100)) ENGINE=innodb;

//2 启用事务
start transaction;//开启一个事务
insert into user(name) values('张三');
rollback;//回滚事务
commit;//提交事务

 

 

 

 

 

 

 

 

 

 



 

posted @ 2020-11-24 10:36  棉花糖88  阅读(97)  评论(0)    收藏  举报