事务
定义:一条或多条sql语句组成一个执行单位,这个执行单元要么都执行,要么都不执行
事务的特点
- 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
- 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
- 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离
- 持久性:一个事务一旦提交,则它对数据库中的数据改变是永久性的
事务的分类
-
隐式事务:没有明显的开启和结束,本身就是一条事务,可以自动提交,比如insert、update、 delete语句等
-
显示事务:具有明显的开启和结束。具体步骤如下:
①开启事务
1.set autocommit = 0;(设置事务的自动提交功能为禁用)
2.start transaction;(可以省略)②编写一组sql语句(仅支持增删改查:select、insert、update、delete)
1.设置回滚点:savepoint 回滚点名;(可写在多条sql语句之间)
2.编写sql语句;
③结束事务(三者需选一)
commit;(提交事务)
rollback;(回滚事务)
rollback to 回滚点名;(回滚到savepoint处)
并发事务
发生条件:多个事务同时操作同一个数据库的相同数据时
并发问题
对于两个事务T1,T2
- 脏读:T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的
- 不可重复读:T1读取了一个字段,然后T2更新了这个字段,之后,T1再次读取相同的字段,值就不同了
- 幻读:T1从一个表中读取了一个字段,然后T2在该表中插入一些新的行。之后,T1再读取同一个表,就会多出来几行
事务的隔离级别
通过设置隔离级别来解决并发问题(对勾代表此种隔离级别下会出现)
事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted(读未提交数据) | ✅ | ✅ | ✅ |
read committed(读已提交数据) | ❌ | ✅ | ✅ |
repeatable read(可重复读) | ❌ | ❌ | ✅ |
serializable(串行化) | ❌ | ❌ | ❌ |
MySQL默认第三个隔离级别:repeatable read
Oracle默认第二个隔离级别:read committed
查看隔离级别:select @@tx_isolation;
设置隔离级别:set global/session transaction isolation level 隔离级别;
- session只针对当前连接,global支持整个数据库的所有连接