Transaction
程序员文章站
2022-04-21 23:51:16
...
Transaction
transaction 事务
commit 提交
rollback 回滚
使用savepoint 保存点名 在当前事务中创建保存点
rollback to savepoint 回滚到创建的保存点
UPDATE...
SAVEPOINT update_done;
INSERT...
ROLLBACK TO update_done;
事务的四个特性ACID
原子性(Atomic):一个事务中所有对数据库的操作是不可分割的。要么全部成功,要么全部失败
-
一致性(Consistency):事务的执行结果必须是数据库从一个一致性状态到另一个一致性状态
一致性:数据库中数据满足完整性约束,相当于数据库只包含成功事务提交的结果
隔离性(Isolated):隔离性是对并发执行而言,各个事务之间不相互干扰
持久性(Durability):一个事务的成功提交,它对数据库中数据的改变是永久性的
事务并发**
- 脏读(dirty read):事务T2读取了事务T1已经修改但还未commit的数据,之后T1回滚了数据
- 不可重复读(unrepeatable read):事务T1在一次事务中两次读取同一行数据,在T1第一次读取数据后,事务T2对数据进行了更新,当T1第二次读取数据的时候,得到以前一次不同的值
- 幻读(phantom read):事务T1在一次事务中两次读取表中的数据,在T1第一次读取记录(多条)后,事务T2 delete/insert 一些记录,当T1第二次读取数据的时候,发现少了/多了一些记录
- 丢失更新(lost update):当两个事务或多个事务对同一行进行数据更新时,会发生丢失更新的问题。最后的更新将重写其他事务所做的更新
不可重复读与幻读的区别:
不可重复读 是对数据行进行修改,导致同一事务两次读取结果不一致
幻读 是对表的数据作delete/insert 操作,导致在同一事务两次读取的结果记录条数有多或少
事务的隔离级别
- read uncommitted(未提交读):这是事务最低的隔离级别。它允许其他事务可以看到这个事务还未提交的数据。这种隔离级别会产生脏读、不可重复读和幻读,因此一般不用
- read committed(提交读):这个隔离级别是许多数据库的默认隔离级别。保证一个事务修改的数据提交后才被其他事务读取,其他事务不能读取该事务未提交的数据。不会出现脏读,会出现不可重复读和幻读
- repeatable read(可重复读):Mysql的默认隔离级别。它除了保证一个事务不能读取其他事务还没提交的数据外,还保证了避免不可重复读。它会锁定读取的所有行。会出现幻读
- serializable(序列化):最可靠的事务隔离级别。所有事务串行执行。读取的每行数据都会进行加锁(它会锁住整个表),会导致大量的锁征用的问题,性能最差。不会出现脏读、不可重复读、幻读
√:肯能会出现 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
推荐阅读
-
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
-
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
-
spring @Transaction事务回滚失败
-
java当中JDBC当中的transaction例子
-
mysql报错:Deadlock found when trying to get lock; try restarting transaction的解决方法
-
解决Django transaction进行事务管理踩过的坑
-
Codeigniter框架的更新事务(transaction)BUG及解决方法
-
php中在PDO中使用事务(Transaction)
-
mysql中TCL(事务控制语言)TRANSACTION
-
MySQL案例03:Cause: java.sql.SQLException: Could not retrieve transaction read-only