事务传播
@H_502_12@PROPAGATION_required | @H_502_12@如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
@H_502_12@PROPAGATION_SUPPORTS | @H_502_12@支持当前事务,如果当前没有事务,就以非事务方式执行。 |
@H_502_12@PROPAGATION_MANDATORY | @H_502_12@使用当前的事务,如果当前没有事务,就抛出异常。 |
@H_502_12@PROPAGATION_REQUIRES_NEW | @H_502_12@新建事务,如果当前存在事务,把当前事务挂起。 |
@H_502_12@PROPAGATION_NOT_SUPPORTED | @H_502_12@以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
@H_502_12@PROPAGATION_NEVER | @H_502_12@以非事务方式执行,如果当前存在事务,则抛出异常。 |
@H_502_12@PROPAGATION_nesTED | @H_502_12@如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_required 类似的操作。 |
事务隔离
数据库并发操作存在的异常情况:
1. 更新丢失(Lost update): 两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来。
1. 更新丢失(Lost update): 两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来。
4. 两次更新问题(Second lost updates problem):
无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效。
5. 幻读(Phantom Reads):
也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询sql语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的。
为了避免上面出现几种情况在标准sql规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。
解决事务并发存在的问题
1.未授权读取(Read Uncommitted):
也称未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据,另外一个事务则不允许同时进行写操作,但允许读此行数据。该隔离级别可以通过
“排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED
隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。
2. 授权读取(Read Committed):
也称提交读。允许不可重复读取但不允许脏读取,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。这可以通过“瞬间共享读锁”和“排他写锁”实现,sql
Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。
3. 可重复读取(Repeatable Read):
禁止不可重复读取和脏读取。但是有时可能出现幻影数据,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。这可以通过“共享读锁”和“排他写锁”实现,在此隔离级下,用SELECT
命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。