mysql详解10:事务

事务是代表单个工作单元的一组sql语句 ,所有的语句都运行成功,否则事务将运行失败。
原子性
一个事务包含多个操作 这些操作要么全部执行,要么全部不执行。在某个操作失败后,会全部回滚。
一致性
系统从一个一致的状态到另一个一致的状态
隔离性
事务之间相互隔离,当有同样的数据被更改时各自受到保护 ,如果多个事务想更改相同的数据,受影响的行就会被锁定,一次只允许一个事务可以更新行,等这个事务完成,其他事务才能进行。
持久性
一旦事务提交,产生的更改是永久的

创建事务

START TRSNSACTION;

INSERT INTO orders(customer_id,order_date,status ) values (1,”2019-01-01”,1);
INSERT INTO order_items values (LAST_INSERT_ID(),1,1);

COMMIT;
ROLLBACK; //回退事务中的所有修改

并发和锁定
当一个用户修改其他用户正在检索或者修改的数据时,并发可能会成为一个问题。
丢失更新
脏读 :一个事务读取了尚未提交的数据
不可重复读:一个事务两次读取的数据不一致 首次读取的数据
幻读:在查询之后才增加的数据
隔离级别
读未提交 READ UNCOMMITTED
读已提交 READ COMMITTED 解决脏读
可重复读 REPEATABLE READ 解决不可重复读 确保数据更改对事务不可见
可序化 SERIALIZABLE 解决幻读 如果数据在期间修改了 我们的事务就会待定

默认级别 可重复读 更高级别的隔离 会有更少的并发问题 但是性能和拓展性会降低
查看隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';
//全局的事务
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
某个会话或者连接的
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

如果想感受各种并发问题,可以开多个对话,修改事务的隔离级别

死锁
如果更新时,遇到其它事务正在执行更新语句 ,必须等其他事务执行完了提交了,才能执行更新语句
当不同事务 互相拿了别的事务所需的锁 互相等待 形成死锁

检查一下事务中语句的执行顺序 在更新语句时保持相同的更新语句的顺序

posted @ 2021-08-02 11:28  下饭  阅读(31)  评论(0编辑  收藏  举报