mysql 数据库的事务
-
我们把一组操作 看做一件事,要么全成功要么全失败。
-
mysql事务是在引擎层实现的
-
innodb引擎支持事务
-
a atomicity 原子性
-
c consistency 一致性
-
i isolation 隔离性
-
d durability 持久性
隔离性
##### 隔离级别 从低到高
1 读未提交 read uncommitted
一个事务 还没有提交 这时候所做的变更被其它事务看到了 脏读 如何解决脏读 读提交
2读提交 read committed
一个事务提交以后他所做的变更才会被其它事务看到
问题 : 不可重复读 (同一个事务 同样的查询 两次结果不一样 ) 如何解决 可重复读 ------- 针对于更新操作
3可重复读 repeatable read
开始读数据的时候 不允许你再更新 update 了
一个事务 执行过程中看到的数据总是跟这个事务在启动的时候看到的数据是一致的,未提交的变更对于其它事务也是不可见的
出现问题 : 幻读 ---------- 针对的是 insert 操作
4序列化 串行化 serializable
读+读锁 写 + 写锁 当出现读写冲突的时候 后边的事务必须等到前面的事务执行完成才可以
Oracle SQL Server 默认隔离级别 是 read committed 读提交
隔离性导致的结果差异
问题 : 不同的隔离级别 V1 V2 V3的值分别是什么?
1. 读未提交 V1 是2 V2 V3也是 2 事务B虽然没有提交但是 变更已经被A看到了
2. 读提交 V1 是 1 V2的值是2 V3 也是2
3. 可重复读 事务在执行期间看到数据前后必须是一致的 所以 事务A提交之前 看得到的值 跟刚开始看到的是一样的
所以V1 V2的值是 1 V3 2
4. 事务B将1改成2 上锁 事务A提交以后 事务B才可以继续执行 从A的角度看 V1 V2 1 V3的值是2
总结: 不同的隔离级别 结果是不一样的 如果有需求 将数据库迁移 比如将mysql 迁移到 Oracle 一定要注意修改隔离级别
修改隔离级别
查看隔离级别
show variables like 'transaction_isolation';
修改
编辑 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
[mysqld]
transaction-isolation = REPEATABLE-READ
表复制
mysql> create table stars1 like stars; #复制stars表 为 stars1
mysql> insert into stars1 select * from stars;
上面是复制结构下面是辅助数据
赋值结构和数据
CREATE TABLE a4 (SELECT
*
from table
)
事务
-
begin 开启事务 start transaction 开启事务
-
commit 提交事务 rollback 回滚事务
-
myisam 引擎不支持事务
-
回滚必须在提交之前
1构建表
create table stansaction(id int primary key auto_increment,uname varchar(20) not null);
2插入数据
insert into stansaction(uname) values("狗本人"),("李白"),("王昭君"),("刘禹锡"),("纳兰容若");
3开启事务
delete from stansaction where id >4;
在查看一次
select * from stansaction;
+----+--------+
| id | uname |
+----+--------+
| 1 | 狗本人 |
| 2 | 李白 |
| 3 | 王昭君 |
| 4 | 刘禹锡 |
+----+--------+
发现被干死了 没关系我没回滚
rollback;
select * from stansaction;
+----+----------+
| id | uname |
+----+----------+
| 1 | 狗本人 |
| 2 | 李白 |
| 3 | 王昭君 |
| 4 | 刘禹锡 |
| 5 | 纳兰容若 |
+----+----------+
2还可以设置回滚点多次回滚
1 delete from stansaction where id = 4;
1 savepoint p1;
2 delete from stansaction where id = 2;
2 delete from stansaction where id = 5;
2 savepoint p3;
3 delete from stansaction;
3 select * from stansaction;
Empty set (0.00 sec)
4 rollback to p3;
select * from stansaction;
+----+--------+
| id | uname |
+----+--------+
| 1 | 狗本人 |
| 3 | 王昭君 |
+----+--------+
5 rollback to p1;
select * from stansaction;
+----+----------+
| id | uname |
+----+----------+
| 1 | 狗本人 |
| 2 | 李白 |
| 3 | 王昭君 |
| 5 | 纳兰容若 |
+----+----------+
6 rollback to p3;
报错