数据库21/11/10
事务
数据库事务介绍
我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务,多个操作要么都成功,要么都不成功
事务:就是完成同一个业务的多个DML操作
例如:图书馆借书业务中,添加借书记录和修改图书库存同时进行,为一个事物
-- 图书馆借书业务
-- 操作一:在图书记录表中添加记录
INSERT into records(snum,bid,books_num,is_return,borrow_date)VALUES('2021001',1,1,0,SYSDATE();
-- 操作二:修改图书库存
UPDATE books set book_stock = book_stock-1 where book_id=1;
数据库事务特性
ACID特性,高频面试题
原子性:一个事务中的多个操作要么同时执行成功,要么同时执行失败,若有未成功的操作,成功的操作要回滚一致性:事务执行之前和事务执行之后数据库中的数据是一致的,完整性和一致性不能被破坏隔离性:数据库允许多个事务一起执行,多个并行的事物之间不能相互影响持久性:事务完成之后,对数据的操作时永久的
MySQL事务管理
自动提交与手动提交
- 在MySQL中,默认DML指令的执行是自动提交的,当我们执行一个DML指令之后数据会进入连接缓存,自动同步到数据库中
![]()
开启事务
开启事务就是关闭自动提交
- 在开启事务第一个操作之前执行
start transaction开启事务 - 依次执行事物中的每个DML操作
- 如果在执行的过程中的任何位置出现异常,则执行
rollback回滚事务 - 如果事务中所有的DML都操作成功,则在最后执行
commit提交事务
-- 图书馆借书业务
-- 开启事务
START TRANSACTION
-- 操作一:在图书记录表中添加记录
INSERT into records(snum,bid,books_num,is_return,borrow_date)VALUES('2021001',1,1,0,SYSDATE());
-- 操作二:修改图书库存
UPDATE books set book_stock = book_stock-1 where book_id=1;
-- 提交(提交后才会交到数据库中,数据库中的数据才会更新)
COMMIT;
事务隔离级别
数据库允许多个事务并行,多个事务之间是隔离的,相互独立的,如果事务之间不相互隔离,操作统一数据时,可能会导致数据的一致性被破坏
MySQL事务隔离级别:

- 读未提交(read uncommitted):T2可以读取T1执行但未提交的数据(T1,T2为两个事务):可能会出现脏读
脏读:一个事务读到了另一个事务中未提交的数据
- 读已提交(read committed):T2只能读取T1已经提交的数据,可避免脏读,但可能出现不可重复读(虚读)
不可重复读(虚读):在同一个事务中,两次查询操作读取到的数据不一致
- 可重复读(repeatable read):T2执行第一次查询之后,在T2事务结束之前其他事务不能修改对应的数据,但可以新增数据,所以有可能产生幻读
幻读:T2对数据表中的数据进行修改然后查询,在查询之前T1箱数据表中新增了一条数据,T2查询时会查询出与修改不一致的数据
- 串行化(serializable):同时只允许一个事务对数据表进行操作,避免了上述问题
设置事务隔离级别
我们可以通过设置数据库默认的事务隔离级别来控制事务之间的隔离性,也可以通过客户端与数据库连接设置来设置事务间的隔离性(在应用程序中设置 Spring)
MySQL中默认的事务级别为可重复读
- 查看MySQL数据库默认的隔离级别
-- 之前的版本
select @@tx_isolation;
-- 之后的版本
select @@transaction_isolation;
- 设置Mysql的默认事务隔离级别
-- 改为读已提交
set session transaction isolation level read committed;

浙公网安备 33010602011771号