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;//提交事务

浙公网安备 33010602011771号