我是数据库和SQL Server的新手.
因此,当我在互联网上搜索关于数据库的事情时,我发现如果数据库服从或遵循ACID(原子性,一致性,隔离性,耐久性)属性,那么数据库就说是好的.
我想知道Microsoft SQL Server(任何版本当前或以前的版本)在内部遵循ACID属性,或者如果我们在我们的应用程序中使用MS SQL Server,那么我们必须编写编码,使得我们的应用程序遵循ACID属性.
简而言之:维护ACID属性是数据库的任务(或责任) 或其应用程序编程的任务.
谢谢..
具体而言,是否存在数据丢失的风险?我正在考虑运行一个密集的事务处理系统,在这个系统中,任何事情都不会丢失.是否有任何关于在关键任务应用程序中使用NoSQL的例子,例如银行交易处理?
我正在阅读Toy URL Shortener的代码.然而,有一些重要的部分我无法理解.
它具有以下代码:
data URLShort = URLShort { state :: AcidState URLStore }
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我在自己的应用程序中写了这样的东西:
data MyApp = MyApp { state :: Int }
Run Code Online (Sandbox Code Playgroud)
然后我可以通过改变来编译
main = warpDebug 3000 MyApp
Run Code Online (Sandbox Code Playgroud)
至
main = warpDebug 3000 (MyApp 42)
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过执行操作来读取处理程序中的状态
mystate <- fmap state getYesod
Run Code Online (Sandbox Code Playgroud)
受到acid <- fmap state getYesod文章的启发.但是,我不知道怎么写.
我也尝试过:
data MyApp = MyApp { state :: State Int Int }
Run Code Online (Sandbox Code Playgroud)
但我对此并没有做多少.
我试图AcidState通过做一些简单的类似例子来弄清楚它是如何工作的,并且认为既然AcidState将所有内容保存在内存中,我应该能够做同样的事情吗?
对这里发生的事情的任何形式的一般性解释,以及也许我如何忽略这一点都将非常感激.
当我从大型Excel中将数据导入新表时,如果一个记录失败,则不会导入任何内容.我认为这是可以的,因为它符合原子性规则.但是,当我修复源数据错误并再次导入时,标识列不是从1开始,而是从一个大值开始.
例如
create table #test (id int identity(1,1), name varchar(4) default '')
insert into #test (name) values('1 insert will failed');
select ident_current('#test') as ident_current
insert into #test (name) values('2 insert will failed');
select ident_current('#test') as ident_current
insert into #test (name) values('3 OK');
select ident_current('#test') as ident_current
select * from #test
drop table #test
Run Code Online (Sandbox Code Playgroud)
结果
id name
----------- ----
3 3 OK
Run Code Online (Sandbox Code Playgroud)
维基百科描述了ACID如下
原子性
原子性要求每个事务都是"全有或全无":如果事务的一部分失败,则整个事务失败,数据库状态保持不变.原子系统必须保证每种情况下的原子性,包括电源故障,错误和崩溃.
因此,如果插入失败,SQL Server似乎不会让数据库状态(标识值)保持不变,那么,这会破坏ACID规则吗?
顺便说一下,当插入失败时,PostgreSQL不会让身份(串行)值增长.(更新:仅有时,请参阅评论.不要依赖于此.).
test=# create table AutoIncrementTest (id serial not …Run Code Online (Sandbox Code Playgroud) 我建议这应该是常见的情况之一,但可能在谷歌搜索时使用错误的关键字.
我只需要用完全随机的密钥创建新的表记录.假设我获得了具有良好随机性的密钥(几乎是随机的).但是,我不能100%确定没有行存在.所以我需要原子地做什么:
我在这个主题上找到的最有用的信息是关于HBase行锁的文章. 我认为HBase行锁是合适的解决方案,但我想在没有显式行锁定的情况下更好地做到这一点.
有人可以加一些有用的建议吗?优选的API是基于Java的,但实际上它更多的是概念而不是实现.
按区域进行数据分片的常用方法是什么?又名 GDPR 执法 - 欧盟数据保留在欧盟。
如果我要将用户保存email在users表中 - 我需要以某种方式将美国和欧盟用户的数据分开。示例mysql表:
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
email VARCHAR(30),
otherSensetiveData VARCHAR(30))
Run Code Online (Sandbox Code Playgroud)
一般来说,我只是想知道如何解决这个问题。
在Oracle中使用NOLOGGING时,比如说插入新记录.我的数据库是否能够从断电中正常恢复?如果它在插入期间随机下降.
我是否正确说明UNDO日志将用于此类恢复...而不是REDO日志使用,如果主数据文件已被物理损坏,则可用于恢复.
可能的重复:
是否有任何符合 ACID 的 NoSQL?
所以,我听说 NoSQL 数据库不符合 ACID,这是为什么?
我试图用C++编写一个类,它提供了一种原子地附加到文件的方法,即使是在写入中断电源的情况下也是如此.
首先,我将当前文件位置(从文件开头的64位偏移量,以字节为单位)写入单独的日志文件.然后,我将请求的数据写入日期文件的末尾.最后,我在日志文件上调用ftruncate()(将截断的大小设置为0).
主要的想法是,如果这个类被要求打开一个非空日志文件的文件,那么你就知道写入被中断了,你可以从日志文件中读取最后一次写入的位置,并将fseek读取到该位置.您丢失了最后一次部分写入,但该文件不应该被破坏.
不幸的是,似乎ftruncate()是异步的.实际上,即使我在ftruncate之后调用fflush()和fsync(),我也会看到日志在执行大量写操作时会增长到数百个字节.它最终总是在0,但我希望它始终在0或8大小.
是否有可能使ftruncate完全同步?或者有更好的方式来使用期刊?
我正在制作一个webapp,他们将是多个用户互相交流,阅读/制定/修改共享数据的决策.
我已经读过交易是原子的,这就是我需要的.但是,我不确定它如何与PHP一起使用PDO::beginTransaction()
我的意思是原子,如果一个事务正在编辑某些数据,所有其他事务也修改/读取该数据将需要等到第一个事务完成.就像我不希望两个脚本读取值,递增旧脚本,并有效地只存储一个增量.第二个脚本应该等待第一个脚本完成.
在几乎所有的例子中,我都看到了连续使用的查询(例如PHP + MySQL事务示例).很多我正在做的事情需要
这是一个例子(这个不需要检查以前的值).我有一个非常基本的收件箱系统,它将邮件存储为序列化数组(如果有人有更好的推荐请告诉我).所以我查询它,附加新消息,然后存储它.它会按预期工作吗?
$getMail = $con->prepare('SELECT messages FROM inboxes WHERE id=?');
$storeMail = $con->prepare('UPDATE inboxes SET messages=? WHERE id=?');
$con->beginTransaction();
$getMail->execute(array($recipientID));
$result = $getMail->fetch();
$result = unserialize($result[0]);
$result[] = $msg;
$storeMail->execute(array(serialize($result), $recipientID));
$con->commit();
Run Code Online (Sandbox Code Playgroud)