重点:事务的隔离级别,脏读幻读不可重复读。
脏读:
A事务执行过程中,B事务读取了A事务的修改。但是由于某些原因,A事务可能没有完成提交,发生RollBack了操作,则B事务所读取的数据就会是不正确的。这个未提交数据就是脏读(Dirty Read)
不可重复读
B事务读取了两次数据,在这两次的读取过程中A事务修改了数据,B事务的这两次读取出来的数据不一样。B事务这种读取的结果,即为不可重复读(Nonrepeatable Read)
幻读
B事务读取了两次数据,在这两次的读取过程中A事务添加了数据,B事务的这两次读取出来的集合不一样。
隔离级别:
REPEATABLE READ Repeatable Read 可重复读
READ COMMITTED Read Committed 读取提交内容
READ UNCOMMITTED Read UnCommitted 读取未提交内容
SERIALIZABLE Serializable 可串行化
修改隔离级别:默认是RR
#需要修改mysql.ini配置文件
#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
– 查看当前隔离级别
select @@tx_isolation;
– 修改当前会话Session隔离级别
set session transaction isolation level read committed
– 查看事务自动提交状态
show variables like ‘autocommit’;
– 开启事务自动提交
set autocommit=0 – 0 是off,1是on
-- Transaction TCL:transaction control language 事务控制语言
/*
数据库事务:逻辑单元,针对DML语句
事务ACID:atomicity,consistency,isolation,durability
原子性:事务中的所有操作,要么全做,要么都不做。偏向事务总体的规则。
一致性:数据库从一种状态转换到另一种状态的一致性。偏向事务状态的一致性。
一个操作导致一张表发生变化,相关表也应该有相应的变化。
隔离性:事务执行不能被其他事务干扰
持续性(永久性):对数据的改变应该是永久性的。
*/
-- Mysql默认自动提交事务,手动提交需要指定。
show variables like '%commit%'; -- 显示事务默认值
set autocommit = off; -- 关闭自动提交
-- 事务的开启,提交,回滚
-- 提交事务:commit 回滚事务:rollback(回滚到事务的初始状态)
start transaction; -- 开启事务
update student set sage = sage-1000 where sname = '关羽';
update student set sage = sage+1000 where sname = '关羽';
commit;
rollback;
-- 设置保存点
start transaction;
savepoint a; -- 设置回滚点
insert into student(sname,sage,cid,ssex) values('俊杰',26,2,'男');
savepoint b;
update student set sage = sage + 1;
rollback to b; -- 回滚到b
commit;
-- 查询时占用
-- 火车票售票窗口 - 买票
start transaction;
select sage from student where sid = 1 for update; -- 占用这个资源
update student set sage = 18 where sid = 1;
commit;
rollback;
/*
并发问题:多个线程同时对数据库进行操作
脏读:事务A读到了事务B未提交的数据
不可重复读:
幻读/虚读:
*/
/*
事务隔离级别
*/
-- DDL:默认隐式commit事务提交
create table aa (
aa int,
bb int
)
-- 展示所有表格
show tables;