事物
事物的基本介绍
- 概念: 如果一个包含多个步骤的业务操作,被事物管理,那么这些操作要么同时成功,要么同时失败.
三个比较重要的操作 :
1.开启事物 : start transaction;
2.回滚 :rollback;
3.提交事物 :commit;
回滚事物
update account set money = 10000; -- 恢复数据
start transaction ; -- 开启事物
update account set money = money-1000 where name='小张'; -- 扣除小张账户的钱
update account set money = money+1000 where name='小风'; -- 给小风的账户添加钱
rollback; -- 回滚事物
提交事物
start transaction ; -- 开启事物
update account set money = money-1000 where name='小张'; -- 扣除小张账户的钱
update account set money = money+1000 where name='小风'; -- 给小风的账户添加钱
commit; -- 提交事物
-
MySQL数据库中事务默认自动提交,事务提交的两种方式:
- 自动提交:
- mysql就是自动提交的
- 一条DML(增删改)语句会自动提交一次事务。
- 手动提交:
-
Oracle 数据库默认是手动提交事务,MYSQL是自动提交事物`
-
需要先开启事务,再提交
-
修改事务的默认提交方式:
-
查看事务的默认提交方式:
-
SELECT @@autocommit;
-
– 1 代表自动提交 0 代表手动提交
-
修改默认提交方式: set @@autocommit = 0;
-
事物的四大特征(面试题常问)
-
原子性:是不可分割的最小单位 ,组成事务的各个逻辑单元不可分割.,要么同时成功,要么同时失败.
-
一致性:事务执行的前后,数据完整性保持一致
-
隔离性:事务执行不应该受到其他事务的干扰,多个事物之间互相独立.
-
持久性:事务一旦提交或者回滚,数据就持久化到数据库中
事物的隔离级别
- 概念: 多个事物之间隔离,相互独立的.但是如果多个事物操作同一批数据,则会引发一些问题,设置不同隔离级别就可以解决这些问题.
- 存在问题
-
脏读:一个事务,读取到另一个事务中没有提交的数据,导致多次读取到的数据不一样。
-
不可重复读(虚读):一个事物读到了另一个事物已经提交的update的数据,导致多次读取到的数据不一样。
-
幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
如何解决这些安全性问题(事物的隔离级别)?
可以通过设置事物的隔离级别解决这些安全性问题
-
read uncommitted(读未提交) : 脏读,不可重复读,虚读都有可能发生
-
read committed(读已提交) :避免脏读。但是不可重复读和虚读是有可能发生
-
repeatable read(可重复读) :避免脏读和不可重复读,但是虚读有可能发生
-
serializable(串行化) :避免脏读,不可重复读,虚读。不会产生任何问题.
注意:1到4安全性越来越高,但是效率越来越低.
- 数据库查询隔离级别:
- *select @@tx_isolation;
- 数据库设置隔离级别:
- *set global transaction isolation level 级别字符串;