1、理解
同时执行的sql语句,要么都成功,要么都失败
例:
---------------------------------
在银行系统中,如果 A 给 B 转账 ,在这个过程中服务器出现问题使得 sql 语句其中一条无法执行,那么 两条 sql 语句计算有一条能执行,也不会成功,
事务就是把一组 sql 语句的运行捆绑在一起放在同一批次中执行,在执行过程中' 同生同死 ' 。
2.事务的 A C I D 原则
原子性:
针对同一个事务
这个过程有两个动作 A转账 B收款
这两个动作只能一起成功,或者一起失败
一致性:
最终一致性:针对事务操作前后的状态保持一致
在操作过程中,A B 的总价值保持一致,在执行过程或不改变。
持久性:
表示事务结束后的数据不随着外界原因导致数据丢失
如果出现意外,但事务没有提交,则重启时恢复到原装时
原装 :A 800 B 200 未提交,之后:A 800 B 200
如果事务提交,则重启时持久化到数据库
A 800 B 200 未提交,之后:A 600 B 400
隔离性:
针对多个用户操作时,排除其他事务对本次事务的影响
两个事务同时进行,但是每个事务之间相互隔离
事务的隔离级别
脏读:
一个事务读取了另一个事务未提交的数据
不可重复读:
在一个事务中多次读取表的数据,多次读取结果不同。
虚读:
指并发环境下一个事务中使用相同条件的两次读取得到的数据量不一致
3.sql 代码
mysql 是默认自动开启事务提交的
set autocommit = 0 /* 关闭 */
set autocommit = 1 /* 开启(默认)*/
事务开启
start transaction --标记一个事务的开始,从这个之后的 sql 都在同一个事务内
insert xxx
insert xxx
提交事务:
提交-----持久化(成功)
commit
回滚-----返回(失败)
rollback
保存点:
SAVEPOINT
------回滚到保存点-----
rollback to savepoint
set autocommit = 0;
start transaction
update account set money=money - 500 where name = 'a'
update account set money=money + 500 where name = 'b'
commit;
rollback;
set autocommit = 1;