1.原子性:要么全做,要么全不做
2.隔离性:保证其它的状态转换不会影响到本次的状态转换
3.一致性(符合所有现实世界的约束):
- 数据库本身能为我们保证一部分一致性需求,比如MySQL数据库可以为表建立主键、唯一索引、外键、声明某个列为NOT NULL来拒绝NULL值的插入。又比如对某个列建立了唯一索引时,如果插入某条记录时该列的值重复了,那么MySQL就会报错并且拒绝插入,MySQL还支持CHECK语法来自定义约束,但是实际上MySQL并不会去检查CHECK子句中的约束是否成立,但是我们还是可以通过定义触发器的方式来自定义一些约束条件以保证数据库中的一致性
- 更多的一致性需求需要靠写业务代码的程序员自己保证,现实生活中复杂的一致性需求比比皆是,而由于性能问题把一致性需求交给数据库去解决这是不现实的,所以就把锅甩给了业务端程序员
原子性和隔离性都会对一致性产生影响,数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果
4.持久性:状态转换后,这个转换的结果是永久保留的
事务的定义:把需要保证原子性、隔离性、一致性、持久性的一个或多个数据库操作称之为一个事务
事务的状态转换图如下
隐式提交
当我们适用START TRANSACTION 或者BEGIN 语句开启了一个事务,或者把系统标量auto commit为OFF时,事务就不会进行自动提交,但是如果我们输入了某些语句之后就会悄悄的提交掉
1.定义或修改数据库对象的数据定义语言:所谓的数据库对象,指的就是数据库、表、视图、存储过程等,当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前面语句所属的事务
2.隐式使用或修改数据库中的表:当我们使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时也会隐式的提交前面语句所属于的事务
3.事务控制或关于锁定的语句:当我们在一个事务还没有提交或者回滚时就又使用START TRANSACTION 或者BEGIN语句开启了另一个事务,会隐式提交上一个事务
4.加载数据的语句:使用LOAD DATA等
5.关于MySQL复制的一些语句:使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时也会隐式的提交前面语句所属的事务
6.其它的一些语句:使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句
保存点
定义保存点的语法如下:
1 | SAVEPOINT 保存点的名称 |
1 | ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称 |