事务的基本概念

事务(Transation):作为一个单独单元的一个或者多个sql语句组成。这个单元中的每一个sql语句都是相互依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能成功完成,整个单元就会回滚。所有影响到的数据库将返回事务开始以前的状态。因此,只有事务中所有语句都被成功的执行才能说整个事务被成功执行。

事务与ACID属性:

  • 原子性Atomicity
  • 一致性Consistency
  • 孤立性Isolation
  • 持久性Durability

事务的生命周期:

通过start transaction/begin/begin work语句开始,以commit或rollback语句结束。

事务隔离级别

事务的隔离级别数据安全性从高到低,性能从低到高分为以下四个:

  • serializable 序列化隔离:按顺序执行事务。
  • repeatable read 可重复读(Mysql默认):事务开启后,就算别的事务修改了原来的数据,也不会影响当前事务的数据。
  • read committed 提交读:事务开启后,别的事务提交后修改了原来的数据,当前事务在修改数据后会读取别的事务修改后的数据。
  • read uncommitted 未提交读:事务开启后,别的事务修改了数据还未提交,当前事务也会读取到修改后的数据。如果别的事务回滚了,当前事务就读取到了错误的数据。
1
2
3
4
-- 查询全局的或者本次连接session的隔离级别
select @@global.tx_isolation,@@session.tx_isolation;
-- 修改隔离级别
set session transaction isolation level serializable;

事务性能

使用事务表时,提高性能的一些方法:

  • 使用小事务
  • 选择合适的隔离级别,平衡性能、安全性。
  • 保证开始事务前一切都是可行的
  • 避免死锁

锁:表锁定、页锁定、行锁定。

1
2
3
4
5
6
-- 对表xxx进行read锁  使各个链接对表可以读而不能写
lock table xxx read;
-- 对表xxx进行write锁 是当前链接对表可以读写、别的链接不能操作
lock table xxx write;
-- 解锁
unlock table xxx;