数据库事务操作
来源:互联网 发布:tomcat 8.5 java 编辑:程序博客网 时间:2024/06/03 22:07
对数据库的每次操作都可以看做是事务。
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。
事务的特性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况。
一致性:保证数据库始终保持数据的一致性——事务操作之前是一致的,事务操作之后也是一致的,不管事务成功与否。如上面的例子,转账之前和之后数据库都保持数据上的一致性。
隔离性:多个事务并发执行的话,结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行:先来先执行,一个事务执行完了才允许 执行下一个。但这样数据库的效率低下,如:两个不同的事务只是读取同一批数据,这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。
2:事务产生的数据问题
事务操作不慎时会产生一些问题,这些问题统一来说就是事务同时发生时导致数据的不一致问题。
脏读:一个事务对数据进行修改操作,但是没有提交时。另外一个事务对该数据库进行使用,这样就会导致数据的不一致,不正确,读取的该数据为脏数据,读取操作为脏读。
不可重复读:指的是连续的读取数据,数据值不一致。即第一个事务读取数据还没结束时,第二个事务对数据进行了修改操作,致使第一个事务再次读取的时候,读取的数据与第一次读取到的数据是不一致的,即数据值不是重复的,成为不可重复读。
幻读:一个事务对全表进行修改操作时,另一事务向数据库表中插入一条数据,这是第一个事务会发现有一条数据它没有修改,像发生幻觉一样。
3:事务的隔离级别
来看看什么是为了解决上述问题引入的事务的隔离级别?
串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。
可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。
读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。
读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。
- 数据库事务操作
- 数据库中的事务操作
- android数据库事务操作
- Android数据库事务操作
- android数据库事务操作
- Android数据库事务操作
- 数据库操作序列“事务”
- 数据库事务操作
- 数据库操作事务小结
- PHP 数据库 事务操作
- Android 数据库事务操作
- 数据库操作之事务
- 数据库事务操作
- SpringBoot 数据库操作、事务
- Qt数据库事务操作
- 数据库事务操作+数据库事务隔离级别
- Java-数据库操作 事务操作
- 数据库操作封装--执行事务
- jQuery的选择器中的通配符[id^='code']
- Eclipse自动化代码分析工具
- VisualSVN 破解
- 滚动选择器PickerView
- 推荐系统的总结,主要是讲述矩阵分解在协同滤波系统中的作用
- 数据库事务操作
- mysql配置文件的常见修改
- user interface
- iOS设置NSString的枚举
- 文本随机
- Uicc之UiccCardApplication(转)
- 如何命名CSS文件及样式规范更利于SEO优化
- spring 下载地址
- 如何将GridViewEX升级到UWP(Universal Windows Platform)平台