数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
1.事务的ACID特性
1.1原子性(atomicity)
事务具有原子不可分割的特性,要么一起执行,要么都不执行。
1.2一致性(consistency)
在事务开始和事务结束是,数据都保持一致。
1.2隔离性(isolation)
在事务开始和结束过程中,事务保持着一定的隔离特性,保证事务不受外部并发数据操作的影响。
1.4持久性(durability)
事务完成后,数据将会被持久化到数据库中。
2.事务的状态
提交:【commit】 回滚【rollback】
begin; --开启事务
update account set abalance=abalance-2000 where aid=1;
update account set abalance=abalance+2000 where aid=2;
commit; --提交
--或者
rollback; --回滚
--还可以设置打点事务,即再保存点之前的会提交,保存点之后的会回滚
start transaction;
update account set abalance=abalance-1000 where aid=1;
savepoint A;
update account set abalance=abalance-2000 where aid=1;
update account set abalance=abalance+2000 where aid=2;
rollback to A;
3.事务隔离级别
当两个并发事务同时访问数据库表相同行是,可能会出现幻读、不可重复读取、脏读等问题,因此定义了事务的隔离级别来处理这些问题。
脏读 | 不可重复读 | 幻读 | |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | √ | |
Serializable | × | × | × |
3.1设置事务的隔离级别
--设置read uncommitted级别:
set session transaction isolation level read uncommitted;
--设置read committed级别:
set session transaction isolation level read committed;
--设置repeatable read级别:
set session transaction isolation level repeatable read;
--设置serializable级别:
set session transaction isolation level serializable;
3.2脏读
事务A读取到事务B为提交的数据。脏数据指的是未提交的数据。
事务A【事务A读取到的8000就是脏数据】 | 事务B |
READ UNCOMMITTED; | READ UNCOMMITTED; |
select * from account ;-- 5000 | select * from account;--5000 |
begin; | |
update account set balance=8000 where accid=1; | |
select * from account ;-- 8000 | |
rollback |
3.3不可重复读
一个事务先后读取同一条记录,二事务在两次读取之间改数据被其他事务所修改,则两次读取的数据不同,即不可重复读。
事务A | 事务B |
READ COMMITTED; | READ COMMITTED; |
select * from account ;-- 5000 | select * from account;--5000 |
begin | |
update account set balance=balance+3000 where accid=1; | |
COMMIT; | |
begin; | |
update account set balance=balance+3000 where accid=1; | |
COMMIT | |
select * from account;-- 11000?? | select * from account;-- 11000?? |
3.4幻读
一个事务按相同的查询条件重新读读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。