定义: 简而言之是一个sql或者是多个sql的操作集,在执行过程中,要么都成功,要么都失败
特点 : 事务有四大特性: 原子性 (整个事务包含的sql要么都执行成功,要么都失败)
一致性 (数据库在事务执行前与执行后是一致的,数据能够对的上)
隔离性 (多个事务之间不相互影 响)
持久性 (事务一旦完成,对数据库的影响是持久性的,不会因为数据库故障丢失事务)
事务并发问题: 脏读: 一个事务A读取了另一个事务B未提交的数据,事务B回滚,会造成A读了额外的数据(脏数据)
幻读: 事务A查数据库,发现没有该记录,于是插入该记录,结果事务B早一步插入,感觉事务A是在幻读
不可重复读: 事务A多次查询数据库,事务B在多次查询过程更改了数据表,造成事务A多次读取结果不一致
事务隔离锁级别:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
read-uncommitted | 允许 | 允许 | 允许 |
read-committed | 不允许 | 允许 | 允许 |
repeatable-read | 不允许 | 不允许 | 允许 |
serializable | 不允许 | 不允许 | 不允许 |
其他: mysql中实现了事务的引擎有: innodb , bdb
事务sql实例:
建表:
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`pass` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '2018-01-01 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `institution_users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`institution_id` int(11) unsigned,
`user_id` int(11) unsigned,
`created_at` timestamp NOT NULL DEFAULT '2018-01-01 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
事务插入数据:
BEGIN;
INSERT INTO users(name,pass,created_at) VALUES('test_user','123456',NOW());
set @my = (select last_insert_id() as user_id);
INSERT INTO institution_users(institution_id,user_id,created_at) VALUES(170,@my,NOW());
COMMIT;
-- 如果报错,手动rollback
-- ROLLBACK;