目录
一、什么是事务
事务(Transaction),是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。
二、MySQL实现事务的步骤
关闭MySQL自动提交 SET AUTOCOMMIT = 0;
开启一个事务,标记事务的起点 START TRANSACTION;
向数据库提交事务 COMMIT;
将事务回滚,所有的数据库操作被取消 ROLLBACK;
开启MySQL自动提交 SETAUTOCOMMIT = 1;
# 事务
-- 创建表
create table bank(
bid int PRIMARY key auto_increment,
bname varchar(10),
bmoney decimal(20,2)
);
-- 添加数据
insert into bank(bname,bmoney)
values('张三',5),('李四',1000);
update bank set bmoney=1000
where bname='李四';
update bank set bmoney=5
where bname='张三';
select * from bank;
-- 关闭自动提交
set autocommit = 0;
-- 开启事务
start transaction;
-- 一组sql语句
update bank set bmoney=bmoney-100 where bname='李四';
update bank set bmoney=bmoney+100 where bname='张三';
-- 事务的结束
-- 提交
commit;
-- 回滚
rollback;
-- 开启自动提交
set autocommit = 1;
三、事务的四个原则(ACID)
1.原子性(Atomic):数据库中的事务执行,不可再分,整个语句要么执行,要么不执行
2.一致性(Consist):事务开始前和事务结束后,数据库的完整性约束吗,没有被破坏
3.隔离性(Isolated):事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,
中间某一时刻的数据
4.持久性(Durable):事务完成以后,该事务对数据库所做的更改便持久的保存在数据库
之中,并不会被回滚
四、MySQL实现事务的隔离性
通常数据库里都是采用锁的机制,保证事务之间的隔离性。
五、事务的并发问题
脏读:指一个线程中的事务读取到了另一个线程中未提交的数据
不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update数据
幻读:指一个线程中的事务读取到了另一个线程中提交的insert数据
六、事务的隔离级别
1. READ_UNCOMMITTED 读未提交
2. READ_COMMITTED 读提交(不可重复读)
3. REPEATABLE_READ 可重复读
4. SERIALIZABLE 串行化
七、事务的隔离级别解决的问题
1. READ_UNCOMMITTED
事务读取:不加锁。
事务写入:加写锁。
解决问题:脏写。
存在问题:脏读、不可重复读、幻读。
2. READ_COMMITTED
事务读取:加读锁(每次select完成都会释放读锁)。
事务写入:加写锁。
解决问题:脏写、脏读。
存在问题:不可重复读、幻读。
3. REPEATABLE_READ
事务读取:加读锁(每次select完不会释放锁,而是事务结束后才释放)
(如果是mysql的innodb还会加间隙锁)。
事务写入:加写锁。
解决问题:脏写、脏读、不可重复读、幻读(如果是mysql的innodb则已解决)。
存在问题:幻读(如果是mysql的innodb则已解决)。
4. SERIALIZABLE
不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束。
八、好好学习,天天向上
good good study , day day up!