目录
如上图,用以前的知识来实现这个需求是没问题的,但是如果出现了 第一条语句执行成功,第二条语句没成功的情况,那么会凭空消失100元 ,要想杜绝这个问题,就应该把这两条语句变成一组语句,要么都成功,要么都失败。这个时候就要用事物来解决。
- -- 事物操作演示
- -- 1,创建一个演示表
- CREATE TABLE demo
- (id INT,
- `name` VARCHAR(10))
- -- 2.开始事物
- START TRANSACTION
- -- 3.设置保存点
- SAVEPOINT a
- -- 4 dml操作
- INSERT INTO demo
- VALUES (1,'张三')
- -- 5,设置第二个保存点
- SAVEPOINT b
- -- 6.再执行dml操作,这里再插入一条消息
- INSERT INTO demo
- VALUES (2,'李四')
- -- 7.查询下现在的demo表
- SELECT * FROM demo
】
回退到某个保存点
- -- 8.回退到保存点b
- ROLLBACK TO b
- -- 9.再次查询demo表
- SELECT * FROM demo
这个保存点就和游戏的存档差不多,选择想要的存档进行读档操作。
其中如果出现没法回档的情况,是因为表的引擎不是INNODB 需要在创建表的时候指定或在设计表中更改。
简单解释,现在有两个连接,A和B
两个人开启事物,A连接修改数据库,但未提交,这时B查询了一下数据库,结果读到了A修改的数据,这就是脏读。
A对数据库进行修改和删除(插入),也提交了,但是b未提交自己的,正常情况下B看到的应该是开始事物时的数据库数据,结果查询数据库时却看到的是被a影响的数据库,这就是不可重复读。(幻读)。
加锁的意思是,同一时间只能有一个连接对数据库进行超支,比如,A对数据库进行修改,但是未提交,这时B查询数据库,就会卡在查询语句上,不执行
事物ACID
使用show engines 来查看所有的引擎
使用 alter table `表名` engines = xxxxx 来修改表的引擎
主要引擎的特点