1.事务
1.1 存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。Mysql的核心就是存储引擎。
-
常见存储引擎
- InnoDB是事务型数据库的首选,执行安全性数据库,行锁定和外键。mysql5.5之后默认使用。
- MyISAM插入速度和查询效率较高,但不支持事务。
- MEMORY将表中的数据存储在内存中,速度较快。
-
查看存储引擎
show engines;
-
修改存储引擎: my.ini
default-storage-engine=INNODB
1.2 事务
事务用于保证数据的一致性,由一组DML操作组成,该组SQL语句要么同时成功,要么同时失败。例如转账。
-
事务的四个特性
- A(Atomicity)原子性:事务是原子工作单元,要么同时执行,要么同时不执行。
- C(Consistency)一致性:符合约束规则;执行之前的整体状态和执行后数据一致。
- I(Isolation)隔离性:并发事务之间相互不影响。
- D(Durability)持久性:事务完成之后,对数据库的影响是永久的。
-
如何使用事务
# mysql默认开启自动事务提交,将每个dml操作当做一个事务。 # 如果需要将多个dml操作放在同一事务,需要关闭自动事务提交 set Autocommit=0; //开启事务 start TRANSACTION; #一组dml操作 update user set money = money -100 where userid = 1; update user set money = money + 100 where userid = 2; ... commit;//提交事务(数据持久化到底层文件中) rollback;//回滚事务(数据恢复到开启事务之前的状态)
-
并发事务的存在问题
-
脏读
一个事务处理过程里读取了另一个未提交的事务中的数据
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时
-