事务
数据库事务处理
- 我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务
- 事务,就是完成同一个业务的多个DML操作
*** 借书业务
*** 操作1 :在结束记录表中添加记录
insert into record(snum,bid,b_num,is_return,b_date) values('1001',1,1,0,sysdate());
*** 操作2 :修改图书库存
update book set b_stock=b_stock-1 where b_id=1;
数据库事务特性
原子性(Atomicity) :一个事务中的多个DML操作,要么同时执行成功,要同时执行失败
一致性(Consistency) :事务执行之前和事务执行之后,数据库中的数据是一致的,完成性和一致性不能被破坏
隔离性(Isolation) :数据库允许多个事务同时执行,多个并行的事务之间不能互相影响
持久性(Durability) :保存在数据库中,事务提交后,对数据的操作是永久的
MYSQL事务管理
自动提交与手动提交
- 在mysql中,默认DML指令的执行是自动提交的,当我们执行一个DML指令之后,自动同步到数据库中
事务管理
- 开启事务,就是关闭自动提交
- 在开始事务第一个操作之前,执行start transaction开启事务
- 一次执行事务中的每个DML操作
- 如果在执行的过程中的任何位置出现异常,则执行rollback回滚事务
- 如果事务中所有DML操作都执行成功,则在最后执行commit提交事务
*** 借书业务
*** 【开启事务】(关闭自动提交---手动提交)
start transaction;
*** 操作1 :在借书记录中添加记录
insert into record(snum,bid,brrow_num,is_return,borrow_date) values('1002',4,2,0,sysdate());
*** select aa;
*** 【事务回滚】(清除连接缓存中的操作,撤销当前事务已经执行的操作)
rollback;
*** 操作2 :修改图书库存
update book set b_stock=b_stock-2 where b_id=4;
*** 【提交事务】(将连接缓存中的操作写入数据文件)
commit;
事务隔离级别
数据库允许多个事务并行,多个事物之间是隔离的,相互独立的;如果事物之间不能互相隔离并且操作同一数据时,可能会导致数据的一致性被破坏。
读未提交(read uncommitted):操作2可以读取操作1执行了但是没有提交的数据,可能会导致脏读
脏读 :一个事务读到了另一个事务中未提交的数据
读已提交(read committed):操作2只读到了操作1提交之后的数据;可能会导致不可重复读(虚读)
不可重复读 :在同一事务中,两次查询操作读取到的数据不一致
可重复读(repeatable read):操作2执行第一次查询后,在事务结束之前其他事务不能修改对应的数据;避免了不可重复读(虚读),但可能会导致幻读
幻读 :操作2对数据表中的数据进行修改然后查询,在查询之前操作1向数据表中新添了一条数据,就导致操作2以为修改了所有数据名单却查询出了与修改不一致的数据(操作1中事务新增的数据)
串行化(serializable):同时只允许对一个事物对数据表进行操作;避免了脏读,虚读,幻读问题
设置数据库事务隔离级别
1、可以通过设置数据库默认的事务隔离级别来控制事务之间的隔离性
2、可以通过客户端与数据库连接设置来设置事务之间的隔离性
3、mysql数据库默认的隔离级别为可重复读
- 查看数据库中默认的隔离界别
*** mysql 8.0.3之前
select @@tx_isolation;
*** mysql 8.0.3之后
select @@transaction_isolation;
- 设置mysql默认隔离级别
set session transaction isolation level <read committed>;