MySQL事务处理
默认情况下,Mysql启用自动提交模式(autocommit为on),这就意味着执行DML语句之后会立即隐式的提交事务 MYSQL 事务处理主要有两种方法:
- 用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN; / START TRANSACTION;开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
- 直接用set来改变Mysql的自动提交模式
- set session/global autocommit = 0;禁止自动提交
- set session/global autocommit = 1;开启自动提交
查看autocommit模式
- SHOW SESSION VARIABLES LIKE ‘autocommit’
- SHOW GLOBAL VARIABLES LIKE ‘autocommit’
查看当前会话隔离级别:
- mysql5: SHOW VARIABLES LIKE ‘tx_isolation’;
- mysql8:SELECT @@global.transaction_isolation,@@transaction_isolation;
设置当前会话隔离级别:
- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
- conn.setTransactionIsolation(int level) — 设置事务的隔离级别.
事务的基本要素ACID
A(Atomicity) 原子性:
- 整个事务中的所有操作,要么完成,要么全部不完成,不可能停滞在中间某个环节。
C(Consistency) 一致性:
在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏
- 实体完整性:规定表的每一行在表中是惟一的实体。
- 参照完整性:是指两个表的主关键字和外关键字的数据应是一致的,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
- 用户定义完整性:
-
即deafult(默认值),not null(非空,列约束), -
unique(唯一,列约束值可以为null但只能有一个null值,也可以为表约束)。
create table t17(
id int,
host varchar(50),
ip varchar(50),
port int,
unique(id),
unique(ip,port)
);
-
primary key(主键)等价于not null unique,字段的值不为空且唯一 -
auto_increment(自增约束)约束的字段必须同时被key约束 -
foreign key(外键,可以为null,但是必要时加上not null),foreign key(关联表id) references(被关联表id) # 被关联表
create table dt(
id int not null unique,
部门 varchar (50),
人数 int
);
# 关联表
create table mes(
id int primary key auto_increment,
姓名 varchar(50) not null,
年龄 int not null,
d_id int,
constraint main_id foreign key(d_id) references dt(id)
on delete cascade # 同步删除
on update cascade # 同步更新
);
# 从表插入记录
insert into dt values
(1,'教育部',25),
(2,'通信部',28),
(3,'稽查部',19),
(4,'安全部',8);
# 主表插入记录
insert into mes values
(1,'张三',18,1),
(2,'李四',20,3),
(3,'王五',28,2),
(4,'赵六',22,3);
# 插入记录
insert into mes(姓名,年龄,d_id) values('棱七',88,4);
# 更改id
update dt set id=666 where id=3;
-
check(效验,主要用于增删改查)
I(Isolation) 隔离性:
D(Durability) 持久性:
- 在事务完成后,该事务所对数据库所作的更改应持久的保存在数据库之中,并不会回滚。
事务隔离级别
想要查看mysql的事务隔离级别,前提
- 1,查看是否修改了提交改为了禁止自动提交
- 2,在不同的事务隔离级别设置不同的事务级别
更新丢失(lost update)
也称为丢失修改(Lost to modify):两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的
读未提交(Read-Uncommitted)
- 特点:B事务读取了A事务未提交的数据,读到未提交(可能回滚)的事务数据
- 存在问题:脏读(dirty Reads)
一个事务读到了另一个事务未提交的更新数据; 当事务读取尚未提交的数据时,就会发生这种情况
读已提交(Read-Committed)------------>(Oracle默认隔离级别)
- 特点:B事务能读到A事务已经提交的事务
- 存在问题:不可重复读(Non-Repeatable Reads)
在同一个事务开启后,两次读取同一数据,得到内容不同,也就是有其他事务更改了这些数据;也就是说读到最新的数据
可重复读(Repeatable-Read)------------->(mysql默认隔离级别)
- 特点:B事务开启,没有关闭之前读到的数据都是一致的,不会读到已经更改的数据
- 存在问题:幻读(Phantom Reads)
一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样
可串行化(Serializable)
|