Transactions
-
事务
-
事务代表单个工作单元的一组SQL语句,所有语句都应该成功完成,要不然都运行失败,保证原子性
-
ACID Properties
- Atomicity 原子性
- 每个事务都是一个工作单元,不管包含多少语句,要么全部执行,要么退回撤销
- Consistency 一致性
- 数据库将保持一致的状态
- Isolation 隔离性
- 事务之间相互隔离 , 或者同样的数据被更改时各自受到保护,不相互干扰
- 多个事务更改同一行, 受影响的行会被锁定 , 只有一个事务能更新这个行,其他事务必须等这个事务完成才能开始
- durability 持久性
- 事务产生的更改是永久的,停电或系统崩溃也不会丢失更改的内容
- Atomicity 原子性
-
如果语句没有返回错误他就会提交, 由一个自动提交系统管控,没有错误就自动提交,可设置变量关闭自动提交
-
先来看看官方文档
-
START TRANSACTION [transaction_characteristic [, transaction_characteristic] ...] transaction_characteristic: { WITH CONSISTENT SNAPSHOT -- 这只适用于innodb -- 不会更改当前事务隔离级别,因此只有当前隔离级别允许一致性读时,它才提供一致性快照 -- 允许一致性读的唯一隔离级别是repeatable read | READ WRITE -- 读写 | READ ONLY -- 只读 } BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1}
-
show variables like "autocommit"; -- 如果想要关闭 set @@autocommit = 0;
-
demo
-
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
Concurrency and Locking
- 多个用户访问相同数据时,就是并发问题,一个用户修改其他用户正在检索或修改的数据时并发可能会产生问题
- 在系统默认事务处理时, 事务对一行或多行进行数据操作在没有提交commit之前都会对这些行上锁,除非超时回滚
Concurrency Problems
- 并发问题
Lost Updates
- 丢失更新
- 多个事务尝试更新相同的数据 ,并且没有上锁 最晚提交的事务会覆盖较早事务所做的更改
- 举例
- 事务A想更新地址信息
- 事务B想更新积分信息
- 因为没上锁,两个事务都可以读取客户信息
- 两个事务获取到的信息都是(John , NY , 10)
- 各自进行了更改
- transaction A更新了地址信息,提交了
- Transaction B 更新了积分信息,后于A提交了
- Transaction B 就会