事务作为一组不可分割的逻辑单元而被执行,如有必要,它的执行效果是可以被撤销的。事务处理通过提交和回滚功能实现。提交和回滚才做确保没能全部完成的操作不会对数据库进行影响。财务转账就是一个好例子。
事务的另一个用途是确保在某个操作所涉及的数据行在你使用的时候不会被其他用户更改。MYSQL在执行每条操作的时候会对那个操作所涉及到的资源进行加锁以避免各语句之间相互干扰。但这仍然不能保证每一个数据操作得到预期效果。虽然对数据库进行CRUD操作的时候线程是阻塞的,但是不能保证多条SQL一起执行的时候,这组SQL所涉及到的所有资源都是线程安全的。
所有事务可事先对这组SQL会涉及到的资源事先加锁。
事务所具有的属性:原子性,稳定性(执行事务前后数据库都是稳定的),隔离性,可靠性。
使用事务会增加新能,内存的开销。要合理利用(我们可以看作每条SQL都是一个事务!因为自动提交)。
默认情况下,MYSQL是自动提交模式(每条语句执行完毕都会把它做出的修改提交到数据库并持久化)。假如需要使用事务,你必须禁止自动提交并告诉SQL何时提交以及回滚操作。
第一句开启一个事务,关闭自动提交,之后执行操作,但是不持久化。最终 COMMIT 进行持久化,并恢复自动提交。
回滚:
使用存档点,可选择退回到固定的点,然后进行持久化。
事务的隔离性
MyISAM 使用了表级锁,当一个用户都某张表进行操作的时候,另一个用户就要等待。
InnoDB进行了优化,某个用户修改了某一行的时候,另一个用户可以对同一张表的另一行进行修改或者查询操作。
为了结果上述问题,InnoDB 提供了四种隔离级别:
设置隔离级别:
对于不支持事务的数据库来说 ,可以使用锁定表的方式进行操作。
也可单独锁定读操作或者写操作。
或者使用相对更新也能解决上述问题。