目录
什么是事务?
两种方式实现事务:
方法一
方法二:
事务四大特性(简称ACID)
并发事务问题(面试题)
事务隔离级别
什么是事务?
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作视为一个整体,要么同时成功,要么同时失败。
例如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。
若李四账户的钱增加1000时,抛出异常,没能增加1000,就会出现安全问题,要保证这一组操作同时成功或失败。
这时就需要通过数据库的事务来完成:
需要在业务逻辑执行之前开启事务,执行完毕后提交事务(事务提交后才能修改数据库数据)。
如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。
两种方式实现事务:
方法一
设置手动提交事务,在一组操作执行完毕后提交事务,若中途出现异常则回滚事务
查看事务提交方式:( 1 自动提交事务,0 手动提交事务)
SELECT @@autocommit ;
修改事务提交方式
SET @@autocommit = 0 ;
一组操作执行完毕后,提交事务:
COMMIT;
一组操作执行中途抛出异常,回滚事务:
ROLLBACK;
方法二:
无需修改数据库的事务提交方式,在要使用事务,使用命令开启事务
开启事务:
START TRANSACTION ;
或
BEGIN ;
一组操作后...
提交事务 COMMIT;
或
回滚事务 ROLLBACK;
事务四大特性(简称ACID)
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):所有事务完成时,最终必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的,因为数据的改变最终是存放在磁盘上的。
并发事务问题(面试题)
- 赃读:一个事务读到另外一个事务还没有提交的数据。
- 不可重复读:在一个事务(Transaction)内,多次读取同一数据集合时,可能会得到不同的结果。这种情况通常发生在其他事务在当前事务执行过程中修改了这些数据
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。例如
脏读:
在事务B执行1操作时,查询到了事务A还没提交时的数据
不可重复读:
在事务A两次查询期间,有另外的事务 B修改id=1的数据,导致两次相同的查询结果不一致,这就是不可重复读的问题。
幻读:
在事务A操作1时去查询id=1的数据时,数据不存在,所以继续执行2操作,但是在执行2操作之前有其它事务B插入了id=1的数据,导致事务A的操作2插入失败,由于处理了不可重复读问题,操作3查询时id=1时查询结果依然是id=1的数据不存在,就出现的“幻读”问题
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | × | × | × |
Read committed | √ | × | × |
Repeatable Read(默认) | √ | √ | × |
Serializable | √ | √ | √ |
Read uncommitted - 可读位提交事务,不能解决 脏读、不可重复读 、幻读问题,其它如表格所示
从上到下,性能逐渐降低,但数据安全性逐渐增强。
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
如设置当前会话的事务级别为READ COMMITTED:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;