事务的四个特性(ACID)
- 原子性(atomicity)
操作同一对象的事务,要么同时成功,要么同时失败
- 一致性(consistency)
事务的最终结果是保持一致
- 隔离性(isolation)
多个事务之间互不干扰
- 持久性(durability)
事务一旦提交到数据库中,那么它在数据库中的对应数据状态的变更,就已经永久保存到数据库中,不可逆转
脏读 不可重复读 幻读
脏读:一个事务读取到了来自另外一个事务未提交的数据
不可重复读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
幻读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
参考博文:https://blog.csdn.net/dengjili/article/details/82468576
操作事务
--mysql 默认是事务自动提交的
set autocommit = 0 --关闭事务自动提交
set autocommit = 1 --开启事务自动提交
start transaction --开启一个事务
commit --事务提交,提交之后,事务就会持久化到数据库中
rollback --事务回滚
savepoint 保存点名 --设置一个事务保存点
rollback to savepoint 保存点名 --回滚到事务点
release savepoint 保存点名 --撤销保存点
模拟事务
-- 模拟转账事务
-- 关闭自动提交
SET autocommit = 0;
-- 开启事务
START TRANSACTION; -- [可选]
UPDATE shop SET money = money-50 WHERE `name` = 'A';
UPDATE shop SET money = money+50 WHERE `name` = 'B';
-- 提交事务
COMMIT
-- 事务回滚
ROLLBACK
-- 事务完成 开启自动提交
SET autocommit = 1;
事务的隔离级别:
-- 查询当前隔离界别
select @@tx_isoation;
oracle:两种隔离级别: read commited serializable,默认的事务隔离级别为read commited
mysql:四种隔离级别 :
-
read unncommited(读未提交数据):脏读,不可重复度和幻读都会出现
-
read commited(读已提交数据):可以避免脏读 ,
-
repeatable read(可重复读):可以避免脏读与不可重复读,
-
serializable(串行化):所有并发问题都可以解决,但是性能十分低下
mysql的默认隔离级别是为repeatable read.