1. 什么是事务(Transaction)?--->事务是访问并可能更新数据库中各项数据项的一个程序执行单元,也是数据库并发控制的基本单位。
事务内的语句,要么全部执行成功(提交事务),要么全部执行失败(发生回滚,撤销之前的所有操作)
2. 事务原则 --->原子性、一致性、持久性、隔离性
原子性(Atomicity): 要么都成功,要么都失败
一致性(Consistency): 事务前后的数据完整性要保证一致
隔离性(Isolation): 多个并发事务之间要相互隔离,不能被其他事务的操作数据所干扰
持久性(Durability): 事务一旦提交则不可逆
3. 隔离导致的问题
脏读-->指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读-->指在数据库访问中,一个事务范围内多次查询却返回了不同的数据值。
幻读-->在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
4. SQL的四个隔离级别
提交读(Read Committed): 事务中的修改只有提交以后才能被其它事务看到。
未提交读(Read Uncommitted): 一个事务能够读取到别的事务中没有提交的更新数据。若事务修改了没有提交,其他事务也能看到。
可重复读(Repeated Read): 在同一事务中先后执行的多次查询将返回同一结果。
可串行化(Serializable): 不允许事务并发执行,强制事务串行执行。在读取的每一行数据上都加上了锁,读写相互都会阻塞,效率低,这种隔离级别最高,最安全。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read Committed | × | √ | √ |
Read Uncommitted | √ | √ | √ |
Repeated Read | × | × | √ |
Serializable | × | × | × |
√ 表示会发生,× 表示不会发生
CREATE TABLE `account`(
`id` INT(3)NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `account`(`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)
//事务
SET autocommit = 0;//关闭自动提交
START TRANSACTION //开启一个事务(一组事务)
UPDATE `account` SET money=money-300 WHERE `name`='A'
UPDATE `account` SET money=money+300 WHERE `name`='B'
COMMIT; //提交事务,就被持久化了!
ROLLBACK; //回滚
SET autocommit = 1; //恢复默认值