1. 概念
mysql 事务是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如我们的银行转账:
a->-100
update user set money=money-100 where name='a';
b->+100
update user set money=money+100 where name='b';
这就是一个事务,就是a给b转账,他俩的账户应该同时发生变化。
实际程序中,如果只有一条语句执行成功了,而另外一条没有执行成功?
出现数据前后不一致
update user set money=money-100 where name='a';
update user set money=money+100 where name='b';
因此在同一个事务中的多条sql语句,可能会有同时成功的要求,要么就同时失败。
2. Mysql 中如何控制事务
2.1 mysql 默认是开启事务的(自动提交)。
查询
mysql> select @@autocommit; // 表示自动提交,每个sql语句都已经实现,所以无法撤销
默认事务开启的作用是什么?
—当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚(rollback)。
mysql> insert into user values(6,"b",1000);
//由于此时数据库的事务是自动提交所以此时回滚操作并不会生效
rollback;
设置mysql 自动提交为false 表示未执行语言,每次进入mysql都是默认提交
set autocommit =0;
//关闭了mysql 的自动提交
mysql> set autocommit =0;
Query OK, 0 rows affected (0.01 sec)
此时我们就可在开启事务后对操作进行回滚。
操作完成后想写入表中可以使用以下命令,这样你的操作结果就会写入到表中,不会被回滚。表示事务结束
commit;
// 自动提交?
@@autocommot=1; 每次进入数据库就会重新设置为1,需要手动设置回0
//手动提交?
commit;
//事务回滚?
rollback;
//事务提供给程序员一反悔的语句,如果没问题就真正写入数据中,没有成功就rollback回滚撤销操作
//开启自动提交
set autocommit=1;
如何开启一个事务:
begin;
start transaction;
上边两个命令都可以手动开启一个事务
2. 事务的特征:
ACID
A:原子性,事务是最小的原子单位,不可以在分割
C:一致性:事务要求,同一个事务中的sql语句必须保证同时成功或者失败
I:隔离性:事务A和事务B之间是具有隔离性的,
D:持久性:事务一旦结束就永久生效,不可以返回。
事务开启:
1.修改默认提交,set autocommit=0;
2.begin;
3.start transaction;
事务提交:
commit;
事务回滚:
rollback;
3. 事务的隔离性
1.read uncommitted; 读未提交的 脏读 不可重复读 幻读
2.read committed; 读已提交的 不可重复读 幻读
3.repeatable read; 可以重复读 幻读
4.serializable; 串行化 性能最差
3.1 read uncommitted
如果有事务a、b
a事务对数据进行操作,操作过程中,事务没有提交,但是b可以看见a的操作结果。
这就是脏读
—转账业务,小明转账给淘宝800
小明 账户有1000
淘宝 账户有1000
insert into user value(2,'小明',1000);
insert into user value(3,'淘宝店',1000);
mysql> select * from user;
+----+-----------+-------+
| id | name |</