事物的实现方式:
- 多线程
- 日志
sql语句全部插入日志文件,日志文件再将插入的全部sql语句写入mysql中,写入之后,多个线程来操作mysql里面的sql语句。
- 原理:
事务的操作:
- 开启:begin,先运行begin才能开始事务
- 提交:commit,操作完成之后提交到数据库
- 回滚:rollback,在提交之前回滚,撤销之前的操作。若要重新开始操作,需要重新运行begin再进行操作。
-- 创建一个表
create table user(
id int(255) PRIMARY key auto_increment, -- 用户id,自动增长
money double(6,2) not null, -- 用户钱数
name varchar(255) -- 用户姓名
)ENGINE=INNODB
-- 插入数据
INSERT into user(money,name) VALUES ('1000','李四'),('1000','王五');
-- 查看表
SELECT * from user
-- 开启事务
BEGIN;
-- 操作
UPDATE tab1 set money = money - 200 where id ='1' -- 李四转两百给王五
UPDATE tab1 set money = money + 200 where id ='2' -- 王五收两百
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 开启事务
BEGIN;
-- 操作
UPDATE tab1 set money = money - 200 where id ='1' -- 李四转两百给王五
UPDATE tab1 set money = money + 200 where id ='2' -- 王五收两百
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
执行commit 后
若执行commit前执行rollback回滚,则双方钱数不会发生改变
引擎方面
另外,在引擎方面,INNODB是支持事务的引擎,而myisam引擎是不支持事务的,它通常是放在读写分离里面做读库的引擎使用,因为读的时候不需要事务,不会让数据发生影响和改变。它的读取的效率非常高。
此引擎支持事务,代码以下的事务生效。
此引擎不支持事务,因此代码以下的事务不生效