如何确保您的sql事务安全?

时间:2009-10-03 03:02:24

标签: sql

也许这个问题具有误导性,但如果你能回答它,那么就这样做。

我记得发过很多SQL问题,有时会有人说我的交易不安全。我永远记不起这个案子。它们是什么?

IIRC当我在表格的开头读取然后再写,显然其他交易甚至可以写你的未完成?我也不记得如何纠正它们,在这种情况下我想做假编写者?但我很肯定这一段完全是错的,因此提出了问题。是否有交易可能不安全的情况,我可以做些什么来保证交易安全?

我主要使用SQLite,有时使用mysql

1 个答案:

答案 0 :(得分:0)

而不是 交易 ,您可能会谈论更广泛的 锁定 概念,即有序管理并发访问数据库 这两个概念是独立的,但经常一起使用(特别是事务往往暗示某种形式的锁定,但也可以在没有任何事务的情况下引入锁定)。大多数为事务提供支持的DBMS都提供了特定的功能,例如将两个概念结合在一起的事务隔离级别。

事务的目的是将对数据库的一系列更改作为单个操作进行处理。以这种方式,如果某些与这些更改相关的步骤失败,SQL将能够“回滚”作为事务的一部分所做的所有更改。这对于确保数据库的引用完整性非常重要。例如,为了防止向数据库添加新的Employee记录,但未能在Payroll表中关联此记录。 ; - )

锁定的目的,即指定一个特定的临时规则列表,这些规则将阻止DBMS的其他用户访问(用于写入和可能用于读取)与特定CRUD操作相关联的数据库部分(即,更改数据库内容的操作)。这个想法是为了防止说Alice和Bob同时尝试减少办公室的苏打水库存水平。它们(它们实际运行的SQL语句)可以可行地读取给定苏打品牌的当前数量,将该值减去它们每个刚刚取出的数量并将新数量存储回数据库中。由于它们都读取相同的原始值,因此完成这两个SQL语句中的第一个所做的更改将被最后一个覆盖。

锁定(或事务隔离级别)可能很难设置,因为它们会影响SQL服务器的吞吐量。基本上可能会导致特定查询停止,并等待锁定被释放。有不同类型的锁:行级,表级等,还有write-lock或read_and_write_lock。可以想象,如果使用SQL服务器的所有各方都在表级别锁定他们正在运行的任何查询,那么可以服务的用户数量将大幅下降。在某些情况下,会出现 死锁 ,例如,当某个特定的SQL语句锁定表的某个特定部分,然后等待另一个查询完成并删除其锁定时在另一张桌子上。如果另一个查询本身正在等待第一个查询删除其对第一个表的锁定,那么我们会有一个循环的情况,这个情况会无限期地发生(并阻止其他查询访问与这两个锁相关的数据!)

更多信息:对于 MySql
 注意:并非MySq1中的所有存储引擎都支持事务  Transaction Isolation Levels
 Locks with InnoDB store
 对于 SqlLite
SqlLite transaction syntax
使用SqlLite,事务级别由延迟立即独占关键字定义。