如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
开启事务:begin/start transaction
提交:commit
回滚:rollback
设置保存点:savepoint(配合rollback使用)
事务提交的两种方式
自动提交
手动提交
MySQL中事务默认自动提交
MySQL一条DML语句就提交一次事务
Oracle中事务默认手动提交
Oracle执行完DML语句要commit,不然没有保存(自动有begin,不自己写)
-- 查看事务的默认提交方式 1--自动提交 0--手动提交 select @@autocommit; -- 修改事务的默认提交方式 set @@autocommit=0;保存点
start transaction; delete from account where id = 25; savepoint a;-- 设置保存点 delete from account where id = 28; rollback to a;-- 回滚到保存点
回滚到保存点,保存点搭配rollback使用
Truncate清空表不能回滚(显示成功,但是无效)
delete删除数据可以回滚
事务的四大特性| ACID | 事务的四大特性 |
|---|---|
| 原子性(atomicity) | 一个事务是一个不可分割的最小工作单元,事务中的所有操作要么全部执行成功,要么全部失败,不会出现有部分操作执行成功的情况 |
| 一致性(consistency) | 事务必须让数据库从一个一致性状态到另一个一致性状态,从两个人都是1000块钱的状态,到一个是500一个人是1500的状态,不会出现中间状态 |
| 隔离性(isolation) | 事务在提交之前的所有操作对其它事务是不可见的,一个人是500块另一个人1500块,并且未提交之前,别人看到的还是两人都是1000块 |
| 持久性(durability) | 事务一旦提交,事务里的所有修改会持久的保存到数据库中(此时即使系统崩溃,修改的数据也不会丢失) |
多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别可以解决这些问题
存在问题
丢失更新:当两个或多个事务选择同一行,最初的事务修改的值,会被后面的事务修改的值覆盖。
脏读:一个事务读取到另一个事务中没有提交的数据
不可重复读(虚读):在一个事务中,两次读取到的数据不一样
幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离级别
read uncommitted:读未提交
产生的问题:脏读、不可重复读、幻读
read committed:读已提交(Oracle默认)
产生的问题:不可重复读、幻读
repeated read:可重复读(Mysql默认)
产生的问题:幻读
serializable:串行化
可以解决所有问题
| 隔离级别 | 丢失更新 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|---|
| Read uncommitted | × | √ | √ | √ |
| Read committed(Oracle默认) | × | × | √ | √ |
| Repeatable read(MySQL默认) | × | × | × | √ |
| Serializable | × | × | × | × |
备注 : √ 代表可能出现 , × 代表不会出现 。
注意: 隔离级别从小到大安全性越来越高,但效率越来越低,要选择合适的隔离级别保证相对安全的同时效率较高
-- 查询数据库的隔离级别 select @@tx_isolation; -- 设置数据库的隔离级别,设置之后,要重新打开mysql才会生效 set global transaction isolation level "级别字符串";
Mysql数据库没有幻读
事务的隔离级别设置不当会导致事务事务失去隔离性



