什么是事务
事务:数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务时一组不可再分割的操作集合(工作逻辑元)
典型事务场景(转账):
update user_account set balance = balance - 1000 where userID = 3;
update user_account set balance = balance + 1000 where userID = 1;
mysql中如何开启事务
begin / start transaction
commit / rollback
set session autocommit = on/off 设定事务是否自动开启
JDBC编程
connection.setAutoCommit(boolean);
Spring事务AOP编程
expression = execution(com.king.dao.*.*(..))
事务ACID特性
- 原子性(Atomicity):最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚
- 一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致
- 隔离性(Isolation):一个事务所操作的数据再提交之前,对其他事务的可见性设定(一般为不可见)
- 持久性(Durability):事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失
事务并发带来了哪些问题
脏读
不可重复读
幻读
事务的四种隔离级别
SQL92 ANSI/ISO标准:
Read Uncommitted(未提交读)
未解决并发问题;事务未提交对其他事务也是可见的,脏读
Read Committed(提交读)
解决脏读问题;一个事务开始之后,只能看到自己提交的事务所作的修改,不可重复读
Repeatable Read(可重复读)
解决不可重复读问题;在同一个事务中多次读取同样的数据,结果是一样的,这种隔离级别未定义解决幻读问题
Serializable(串行化)
解决所有问题;最高的隔离级别,通过强制事务的串行执行
Innodb引擎对隔离级别的支持程度
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
未提交读(Read Uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable Read) | 不可能 | 不可能 | 对InnoDB不可能 |
串行化(Serializable) | 不可能 | 不可能 | 不可能 |