一.什么是事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败;
二.mysql中的事务
a.mysql引擎是支持事务的;
b.mysql默认自动提交事务的,每条语句都处在独立事务中;
c.手动控制事务
开启事务 begin transaction
回滚事务 commit
结束事务 rollback
三.事务特性
原子性 是一个不可分割的工作单位
一致性 事务必须从一个一致性状态变换到另一个一致性状态, eg:转账 前后总额保持不变
隔离性 每个用户操作事务,事务之间不会互相干扰
持久性 事务一旦被提交就就会永远的改变数据库
四.事务的隔离级别
脏读: 一个事务读取了另一个事务未提交的数据;
不可重复读: 在一个事务中读取表中的一行数据时,多次读取结果不一样。一个事务读取了另一个事务提交完的数据(update)
虚读 在一个事务中读取到了另一个事务插入的数据,导致多次读取数据结果不一致(insert)
数据库通过设置事务的隔离级别防止以上情况的发生:
* 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
* 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
* 4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
* 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。
设置隔离级别必须在事务之前
五.编写事务
时间 |
线程1 |
线程2 |
说明 |
t1 |
begin; |
|
|
t2 |
select * from account where name='zs'; 结果1000块 |
|
|
t3 |
|
begin; |
|
t4 |
|
update account set money=money+100 where name='zs'; |
|
t5 |
select * from account where name='zs'; 结果1100块 |
|
读到了另一个线程未提交事务的数据。赃读发生了 |
t6 |
|
commit; |
|
t7 |
select * from account where name='zs'; 结果1100块 |
|
读到了另一个线程提交事务的update数据。不可重复读发生了 |
t8 |
|
insert into account values(4,'zl',1000); 执行insert语句插入数据,事务自动提交了 |
|
t9 |
select * from account; 查到4条数据 |
|
读到了另一个线程自动提交事务的insert语句数据。虚读发生了 |
t10 |
commit; |
|