Created
January 15, 2022 11:05
-
-
Save zw963/56c95fa75d22a6d134730485a0b0f08a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
begin | |
require "bundler/inline" | |
rescue LoadError => e | |
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" | |
raise e | |
end | |
gemfile(true) do | |
source "https://rubygems.org" | |
gem 'pg' | |
gem 'sequel' | |
gem 'minitest' | |
gem 'minitest-hooks' | |
gem 'database_cleaner-sequel' | |
end | |
system("sudo -u postgres dropdb --if-exists check_sequel_db") | |
system("sudo -u postgres createdb check_sequel_db") | |
DB_URL="postgres://postgres:postgres@localhost:5432/check_sequel_db" | |
DB = Sequel.connect(DB_URL) | |
DB.create_table(:insiders, :ignore_index_errors=>true) do | |
primary_key :id | |
Integer :number_of_shares, :null=>false | |
end | |
class Insider < Sequel::Model | |
end | |
ENV['RACK_ENV'] = 'test' | |
require 'minitest/autorun' | |
require 'minitest/pride' | |
require 'database_cleaner-sequel' | |
DatabaseCleaner[:sequel].strategy = :truncation | |
class Minitest::Test | |
def before_setup | |
DatabaseCleaner[:sequel].start | |
end | |
def after_teardown | |
DatabaseCleaner[:sequel].clean | |
end | |
end | |
require 'logger' | |
LOGGER = Logger.new($stdout) | |
DB.loggers << LOGGER | |
describe 'insider' do | |
it 'test postgres read committed mode default lock' do | |
Insider.create(number_of_shares: 200) | |
puts "Insider count outer thread: #{Insider.count}" | |
thread1 = Thread.new do | |
sleep rand(0.1..0.2) | |
DB.transaction do | |
puts "Insider count inner first thread: #{Insider.count}" | |
insider_1 = Insider.last | |
insider_1.update(number_of_shares: insider_1.number_of_shares - 10) | |
end | |
end | |
thread2 = Thread.new do | |
sleep rand(0.1..0.2) | |
DB.transaction do | |
insider_2 = Insider.last | |
insider_2.update(number_of_shares: insider_2.number_of_shares - 10) | |
end | |
end | |
thread1.join | |
thread2.join | |
assert_equal 180.0, Insider.last.number_of_shares | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment