Mysql事务
事务:事务中的语句要么全部执行,要么全部不执行
1.事务操作
开始事务
BEGIN 或者 START TRANSACTION
提交事务 (控制事务)
COMMIT
回滚事务(出错进行回滚)
ROLLBACK
事务一切正常的情况下 提交所有数据都被插入成功
start transaction
insert into user (uid,uname,uage) VALUES(001,'张三',18);
insert into user (uid,uname,uage) VALUES(002,'李四',19);
insert into user (uid,uname,uage) VALUES(003,'王五',18);
COMMIT;
SELECT * from user;
当事务中出现错误,强行提交只能提交上出错之前的数据
start transaction
insert into user (uid,uname,uage) VALUES(004,'张三',18);
insert into user (uid,uname,uage) VALUES(005,'李四',19);
insert into user (uid,uname,uage) VALUES(003,'王五',18);
insert into user (uid,uname,uage) VALUES(006,'李四',19);
COMMIT;
SELECT * from user;
出错后使用回滚回回到初始位置,及时提交也不会有结果插入
start transaction
insert into user (uid,uname,uage) VALUES(004,'张三',18);
insert into user (uid,uname,uage) VALUES(005,'李四',19);
insert into user (uid,uname,uage) VALUES(003,'王五',18);
insert into user (uid,uname,uage) VALUES(006,'李四',19);
ROLLBACK
COMMIT
SELECT * from user
2.事务四大特性
1. 原子性
事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
2. 一致性
事务完成时,必须使所有的数据都保持一致状态
3. 隔离性
数据库提供的隔离机制,保证事务不受并发影响单独运行
4. 持久性
事务一旦提交或者回滚,它对数据库中的数据的改变就是永久的。
3.事务并发问题
1. 脏读
一个事务读到另外一个事务还没有提交的数据
#由于mysql默认隔离级别会已经解决了脏读和不和重复读,需要进行先设置隔离级别
set SESSION transaction ISOLATION level READ UNCOMMITTED
- 先创建两个链接
- 事务一开始任务,并插入三条记录
- 事务二开始任务, 查询一下user表 发现查询到了还未提交的事务
- 说明发生了脏读
2.不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
#需要进行先设置隔离级别,此隔离级别已经解决了脏读问题(自行测试)
set SESSION transaction ISOLATION level READ COMMITTED
- 开始事务二,查询id 为1的用户信息
- 开始事务一,将uid的年龄更改为99岁,并且提交事务
- 在事务二中再次查询id为1的用户信息,发现两次查询结果不一致
- 说明发生了不可重复读
3. 幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影
#需要进行先设置隔离级别,此隔离级别已经解决了脏读和不可重复读问题(自行测试)
set SESSION transaction ISOLATION level REPEATABLE READ
-
开始事务一插入一条数据
-
开始事务二 查询id为4的用户
- 发现为空,准备插入一条id为4的用户,发现插入失败
- 说明出现幻读
4. 事务的隔离级别
- 查询隔离级别
SELECT @@TRANSACTION_ISOLATION
- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [SERIALIZABLE| read uncommitted| read committed | serializable]
注意:事务的隔离级别越高,性能越低安全越高。