什么事务
- 事务是一种机制、一个操作序列,包含一组数据库操作命令。
- 事务中,把所有命令作为一个整体,一起向系统提交执行,要么全部成功,要么全部失败。
- 事务是一个不可分割的工作逻辑单元。
什么时候会使用到事务
举例:
- 银行转账
A客户找B客户借100元,此时B转100块到A的账户,B账户的余额会减少100元,A客户的余额会增加100元。这至少需要两条SQL语句:
给B的账户减去100元;
update 账户表 set money=money-100 where name=‘B’;
给A的账户加上100元。
update 账户表 set money=money+100 where name=‘A’;
如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么A的账户没有加上100元,而AB减去了100元,在现实生活中这肯定是不允许出现的。
如果在转账过程中加入事务,则整个转账过程中执行的所有SQL语句会在一个事务中,而事务中的所有操作,要么全都成功,要么全都失败,不可能存在成功一半的情况。
也就是说给A的账户减去100元如果成功了,那么给B的账户加上100元的操作也必须是成功的;否则,给A减去100元以及给B加上100元都是失败的。
事务要如何操作
- 开启事务:start transaction 或 begin
- 提交事务:commit
- 回滚事务:rollback
上述案列代码
create table account(id int primary key auto_increment,name varchar(20),money double) charset=utf8;
insert into account values(null,"A",1000),(null,"B",1000);
start transaction;//开启事务
update account set money=money+100 where name="A";
update account set money=money-100 where name="B";
commit;//提交事务
rollback;//回滚事务
事务的四大特性(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
查询事务默认的提交方式:
select @@autocommit;
结果有两种:1—自动提交;0—手动提交。
修改事务提交方式:
set @@autocommit=0/1;
事务的隔离级别
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session transaction isolation level 级别;
读未提交(Read uncommitted)
- 两个事务同时执行,一个事务会读取到另一个事务中未提交的部分。
- 安全性最差,可能发生并发数据问题,性能好。
读已提交(Read committed)
- 两个事务同时执行,一个事务可以读取到另一个事务已提交的数据,不可重复读(在一个事务中两次读取的数据可能不一致。)。
- Oracle默认的隔离级别。
可重复读(Repeatable Read)
- 两个事务同时执行,一个事务内部多次执行sql语句不会读取另一个事务已提交的数据,会出现幻读。
- Mysql默认的隔离级别
串行化(Serializable)
- 多个事务同时执行,执行过程中,当一个事务执行时,其他事务都排队等候。
- 安全性好,但性能低下。
事务的并发问题
- 脏读:读取到其他事务未提交的数据。
- 不可重复读:一个事务重复读取两次,但两次得到的结果不同,说明读取操作结果是不可重复的。
- 幻读:一个事务中修改数据,前后读取到的数据信息不一致,说明事务已插入了其他数据。
有些绕,需要多测试看结果!!